一,在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;}
二,運(yùn)行,得出如下輸出。
2015-07-14 21:44:57.889 ARC不要向已經(jīng)釋放的對(duì)象發(fā)送消息[2245:90589] 12015-07-14 21:44:57.890 ARC不要向已經(jīng)釋放的對(duì)象發(fā)送消息[2245:90589] 1
三,結(jié)果分析。
1,引用計(jì)數(shù)的內(nèi)存回收方式是“只做標(biāo)記,并不抹除相關(guān)數(shù)據(jù)”。有點(diǎn)像是移動(dòng)硬盤中刪除數(shù)據(jù)的時(shí)候,只是刪除數(shù)據(jù),而這些數(shù)據(jù)并沒有真正在移動(dòng)硬盤上進(jìn)行刪除。
2,上面的代碼中obect對(duì)象釋放之后,引用對(duì)象并不總是1,有時(shí)候也會(huì)出現(xiàn)程序崩潰的情況。當(dāng)object對(duì)象所占的內(nèi)存被復(fù)用的時(shí)候,就會(huì)出現(xiàn)程序崩潰的情況。
3,“不要向已經(jīng)釋放的對(duì)象發(fā)送消息”。例子是中是向已經(jīng)釋放的object發(fā)送retainCount消息。
4,當(dāng)一個(gè)對(duì)象通過release內(nèi)存被回收之后,向這個(gè)對(duì)象發(fā)送任何消息,不管輸出結(jié)果是對(duì),是錯(cuò),都是無效的。即使和預(yù)期的一樣,也只是恰巧碰上了。
參考資料:
《iOS開發(fā)進(jìn)階》 --唐巧
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注