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

對應(yīng)的消息發(fā)送方法如下
- 當(dāng)對象被創(chuàng)建(通過 alloc、new 或 copy 等方法)時,其引用計數(shù)初始值為1
- 給對象發(fā)送 retain 消息,其引用計數(shù)加1
- 給對象發(fā)送 release 消息,其引用計數(shù)減1
- 當(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 / 知乎)
謝謝觀看此文。