oc學習之旅 記憶體管理1

2021-06-19 18:56:28 字數 2329 閱讀 5151

c語言中

每初始化一次物件:計數器為1

釋放物件時:計數器-1

被引用的指標計數器為0時

被引用該指標的記憶體自動釋放,引用指標成為野指標除了c

語言的基本資料型別外

oc中得類都加入了物件引用計數 retaincount

1.手動管理引用計數

2.自動管理引用計數 autorelease

nsstring特殊

呼叫物件的

retian copy mutalecopy new alloc

會影響該物件的引用計數為1

呼叫物件的release autorelease會使該物件的引用計數-1

nsstring

*str1 = [[

nsstring 

alloc

]init];

//不遵循**法則

即使初始化 str1.retaincount 為-1 但為了統一**法則

依然要release

nslog(@"%ld",str1.retaincount);

arc中

nsmutablestring* str = [[nsmutablestring

alloc

]init];

//只有oc的物件才有retaincount c中沒有

nslog(@"%ld",str.retaincount);//1

[str retain];

nslog(@"%ld",str.retaincount);//2

[str release];

nslog(@"%ld",str.retaincount);//1

//不寫下面

記憶體洩露

[str release];/*

記憶體管理:誰申請

誰釋放

一對一原則:引用計數+1 或-1 要平衡 */

person *p = [[person

alloc]init];

nslog(

@"count %ld"

,p.retaincount);

[pretain];

nslog(

@"count %ld"

,p.retaincount);

[prelease];

[prelease];

nsmutablestring*str2 = [[nsmutablestring

alloc

]initwithstring

:@"wahaha"];

p.str = str2;

nslog(@"%ld",str2.retaincount);//2

p.str = str2;

nslog(@"%ld",str2.retaincount);//2

[strrelease];

nslog(@"str is %@",p.str);

//如果是有兩個對它進行賦值,如果set方法單純的用self.str = str會崩掉,如果使用self.str = [str retain],那麼對它進行兩次物件的賦值的話第一次賦值的self.str空間沒有被釋放,而self.str現在指向了另乙個空間,所以原來的self.str的retain沒有被釋放所以set方法應該向person類裡面寫的那樣

nsmutablestring*str3 = [[nsmutablestring

alloc

]initwithstring

:@"aaa"];

p.str = str2;

nslog(@"%ld",str2.retaincount);//2

p.str = str3;

nslog

(@"%ld"

,str3.

retaincount

);//2,str2.retaincount變成1

person.h檔案

@property(nonatomic,retain)

nsmutablestring

*str;

person.m檔案

/*不要手動呼叫物件的dealloc方法

當該物件的引用計數為0時系統自動呼叫

物件的成員變數釋放都寫在dealloc中

*/-(void) dealloc

//點語法擴充套件

-(void)setstr:(nsmutablestring *)str  }

//此方法其實保證self.str被第二個其他字串引用時,原來的字串的retain變回self.str沒有被引用的時候,就像人從a房間走到b房間,a房間的人數要減去1,再把b房間的人數增加1

-(nsmutablestring*)str

oc學習之旅 記憶體管理

因為以前的 都是使用非arc 手動管理 而arc還不太完善,因此學習非arc模式還是有必要的。在用非arc模式 引用計數器概念 oc中,在oc定義的型別都設計有乙個引用計數器retaincount。而oc中的引用分兩種,一種是強引用retain 對應arc中的strong 另一種是弱引用assign...

IOS學習 OC記憶體管理

記憶體管理 引用計數器 oc物件被引用的次數,為0的時候該物件被銷毀,記憶體 retain 引用次數 1 返回的是物件本身 release 引用次數 1 沒有返回值 retaincount 獲取引用次數。dealloc oc物件被銷毀的時候會呼叫dealloc方法,繼承該 方法 放最後面 super...

Oc 記憶體管理

1 對你自己擁有的物件負責,你只能釋放你擁有的物件 2 凡是你通過 retain alloc copy等手段獲得了所有者的物件,都必須在你不使用的時候來呼叫release autorelease等手段來釋放對他的所有權 3 在一定的 段內,對同乙個物件所作的copy alloc retain的操作次...