因為以前的**都是使用非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的操作次...