一,在AppDelegate.m中寫入如下代碼:
- (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;}
二,運行,得出如下輸出。
2015-07-14 21:44:57.889 ARC不要向已經釋放的對象發送消息[2245:90589] 12015-07-14 21:44:57.890 ARC不要向已經釋放的對象發送消息[2245:90589] 1
三,結果分析。
1,引用計數的內存回收方式是“只做標記,并不抹除相關數據”。有點像是移動硬盤中刪除數據的時候,只是刪除數據,而這些數據并沒有真正在移動硬盤上進行刪除。
2,上面的代碼中obect對象釋放之后,引用對象并不總是1,有時候也會出現程序崩潰的情況。當object對象所占的內存被復用的時候,就會出現程序崩潰的情況。
3,“不要向已經釋放的對象發送消息”。例子是中是向已經釋放的object發送retainCount消息。
4,當一個對象通過release內存被回收之后,向這個對象發送任何消息,不管輸出結果是對,是錯,都是無效的。即使和預期的一樣,也只是恰巧碰上了。
參考資料:
《iOS開發進階》 --唐巧
新聞熱點
疑難解答