oc學習之旅 記憶體管理

2021-06-19 20:01:11 字數 2754 閱讀 2392

因為以前的**都是使用非arc(手動管理),而arc還不太完善,因此學習非arc模式還是有必要的。

在用非arc模式

引用計數器概念

oc中,在oc定義的型別都設計有乙個引用計數器retaincount。而oc中的引用分兩種,一種是強引用retain(對應arc中的strong

),另一種是弱引用assign(對應arc中weak)。

有趣的是,c中的資料型別都是弱引用,assign。

強引用弱引用都是引用。類似於c++中的&b = a。記憶體位址都是指向被引用的記憶體位址,唯一不同的地方是oc中的弱引用與c中的指標類似,

c中如果p1,p2同時指向了同一塊記憶體空間p,

即 int a = 0,*p = &a,*p1 = p,*p2 = p;

如果當中乙個指標釋放掉了釋放掉了(如free p1),其他指標瞬時間就成為野指標,不能用了。

oc中的弱引用是直接用等號,如 nsmutablestring  *str1 = str;如果str改變了,str1也一起改變,因為它是乙個引用物件,與被引用物件指向同一塊記憶體空間。如果str被銷毀了,str1也成為了「野指標」。也是不能使用的

nsmutablestring*str = [[nsmutablestring

alloc

]initwithstring

:@"111"];

nsstring *str1 = str;

nslog

(@"%@"

,str1);

//列印   111sss

nsmutablestring*str = [[nsmutablestring

alloc

]initwithstring

:@"111"];

nsstring *str1 = str;

[strrelease];

nslog(@"%@",str1);//

沒有東西列印,因為str已經被釋放掉了,str1也不存在了

oc中的強引用與弱引用一樣,都是與被引用物件共享同一塊記憶體位址。與弱引用不同的地方是,強引用增加了引用計數retaincount。當str1強引用了str,retaincount計數器會加1,而str release(相當於 free str)後,retaincount會減1,直到retaincount減為0時候,系統才會自動呼叫dealloc析構函式,把記憶體釋放掉。就是說str1強引用了str,str釋放掉了,str1仍然能使用那塊記憶體。

nsmutablestring*str = [[nsmutablestring

alloc

]initwithstring

:@"111"];

nsmutablestring *str1 = [strretain];

[strrelease];

nslog

(@"%@"

,str1);

//列印的是111sss

有趣的是,c中的型別雖然使用弱引用assign與weak修飾,但是並不是乙個引用,大概是因為oc中完全相容c語言,所以在這方面沒有改,所以assign有兩個含義,乙個是繼續沿用c語言的那套資料型別,另乙個是oc中得弱引用。

舉例說明,我建立了乙個person類,裡面實現了乙個整形a的getter與setter函式。然後例項化了乙個物件p後用a去「弱引用」b,再改變b的值,p.a不變.

在person.h中

@property (nonatomic,assign)int a;

main中

person *p = [[person

alloc]init];

int b  =0;

p.a = b;

b=1;

nslog(@"%d",p.a);//

結果為0

因為c中的大多數都是存放在常量區中,b指向了另乙個常量區中的1,只是c中不像oc中那樣a隨著b的指向而改變,因此不能稱為弱引用。

person *p = [[person

alloc]init];

[p.arr

addobject:@"abc"];

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

nsmutablearray*arr = [nsmutablearray

arraywithobjects

:@"1"

,@"2"

,@"3"

,nil];

p.arr = arr;

[p.arr

addobject:@"wahaha"];

nslog(@"arr is %@",arr);

nsmutablearray*arr1 = [[nsmutablearray

alloc

]init];

//對新增到的物件

引用計數+1

[arr1addobject:p];

[prelease];

nslog(

@"%ld"

,p.retaincount);

//當陣列被釋放或呼叫remove方法時他會對陣列當中的所有物件做一次release操作

[arr1release];

person.h中

@property(nonatomic,retain)

nsmutablearray

*arr;

因為使用了retain強引用,所以當析構時候會計數器會減1

person.m中

-(void)dealloc

-(id)init

returnself; }

oc學習之旅 記憶體管理1

c語言中 每初始化一次物件 計數器為1 釋放物件時 計數器 1 被引用的指標計數器為0時 被引用該指標的記憶體自動釋放,引用指標成為野指標除了c 語言的基本資料型別外 oc中得類都加入了物件引用計數 retaincount 1.手動管理引用計數 2.自動管理引用計數 autorelease nsst...

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的操作次...