一,在AppDelegate.m中寫入以下代碼:app
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
NSObject *object=[[NSObject alloc]init];
NSLog(@"%ld",[object retainCount]);
[object release];
NSLog(@"%ld",[object retainCount]);
return YES;
}
二,運行,得出以下輸出。ide
2015-07-14 21:44:57.889 ARC不要向已經釋放的對象發送消息[2245:90589] 1
2015-07-14 21:44:57.890 ARC不要向已經釋放的對象發送消息[2245:90589] 1
三,結果分析。spa
1,引用計數的內存回收方式是「只作標記,並不抹除相關數據」。有點像是移動硬盤中刪除數據的時候,只是刪除數據,而這些數據並無真正在移動硬盤上進行刪除。code
2,上面的代碼中obect對象釋放以後,引用對象並不老是1,有時候也會出現程序崩潰的狀況。當object對象所佔的內存被複用的時候,就會出現程序崩潰的狀況。對象
3,「不要向已經釋放的對象發送消息」。例子是中是向已經釋放的object發送retainCount消息。blog
4,當一個對象經過release內存被回收以後,向這個對象發送任何消息,無論輸出結果是對,是錯,都是無效的。即便和預期的同樣,也只是恰巧碰上了。內存
參考資料:開發
《iOS開發進階》 --唐巧it