【iOS夯實】內(nèi)存管理之引用計數(shù)

什么是引用計數(shù)

原理

當(dāng)我們創(chuàng)建一個新對象的時候,它的引用計數(shù)為1;當(dāng)有一個新的指針指向這個對象時,我們將其引用計數(shù)加1;當(dāng)這個指針不再指向這個對象的時候,我們將其引用計數(shù)減1;當(dāng)這個對象的引用計數(shù)為0的時候,說明這個對象不再被如何指針指向,這個時候就可以銷毀對象,回收內(nèi)存。

引用計數(shù)原理

對應(yīng)的消息發(fā)送方法如下

  1. 當(dāng)對象被創(chuàng)建(通過 alloc、new 或 copy 等方法)時,其引用計數(shù)初始值為1
  2. 給對象發(fā)送 retain 消息,其引用計數(shù)加1
  3. 給對象發(fā)送 release 消息,其引用計數(shù)減1
  4. 當(dāng)對象引用計數(shù)歸0時,Objective-C 給對象發(fā)送 dealloc 消息銷毀對象

添加編譯參數(shù)

新建一個工程,由于現(xiàn)在的工程默認開啟自動引用計數(shù)(Automatic Reference Count),我們需要修改工程設(shè)置,啟動手工管理引用計數(shù)的模式。
在 Target 的 Build Phases 中給 AppDelegate.m 加上 -fno-objc-arc 的編譯參數(shù)。


添加代碼

在 AppDelegate.m 中添加以下代碼,通過 Log 可以看到引用計數(shù)的變化

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

NSObject *object = [[NSObject alloc] init];
NSLog(@"Reference Count = %lu", (unsigned long)[object retainCount]);
NSObject *anotherObject = [object retain];
NSLog(@"Reference Count = %lu", (unsigned long)[object retainCount]);
[anotherObject release];
NSLog(@"Reference Count = %lu", (unsigned long)[object retainCount]);
[object release];

return YES;

}

運行結(jié)果如下圖


不要向已釋放的對象發(fā)送消息

在上面的代碼中的 object 對象釋放后添加以下代碼

NSLog(@"Reference Count = %lu", (unsigned long)[object retainCount]);

運行后得到結(jié)果會發(fā)現(xiàn)獲取到的引用計數(shù)為1,為什么不是0呢?

因為對引用計數(shù)為1的對象 release 時,系統(tǒng)知道該對象即將被回收,就不會再對該對象的引用計數(shù)進行減1操作,這樣可以增加對象回收的效率,加速對象的回收。

對已釋放的對象發(fā)送消息是不可取的,因為對象的內(nèi)存已被回收,如果發(fā)送消息時,該內(nèi)存已經(jīng)被其他對象使用了,得到的結(jié)果是無法確定的,有可能造成程序異常崩潰。

最后

本人為iOS開發(fā)新手一枚,寫的不好的或?qū)戝e的地方,希望各位大俠能幫忙指正。
各位大俠,如果覺得對自己有點用的,歡迎點個贊,也歡迎大家關(guān)注我( Github / 簡書 / 微博 / Instagram / 知乎)
謝謝觀看此文。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容