一、ARC強(qiáng)制實(shí)施的新規(guī)則
為了工作卓舵,ARC強(qiáng)加了一些在使用其他編譯器模式時(shí)不存在的新規(guī)則南用。
這些規(guī)則旨在提供一個(gè)完全可靠的內(nèi)存管理模型;
在某些情況下掏湾,它們只是強(qiáng)制執(zhí)行最佳實(shí)踐裹虫,在另一些情況下,它們簡(jiǎn)化了您的代碼融击,或者是您不必處理內(nèi)存管理的明顯推論筑公。
如果您違反了這些規(guī)則,就會(huì)立即出現(xiàn)編譯時(shí)錯(cuò)誤砚嘴,而不是在運(yùn)行時(shí)可能變得明顯的微妙錯(cuò)誤十酣。
1、不能顯式地調(diào)用dealloc际长,實(shí)現(xiàn)或調(diào)用retain, release, retainCount, or autorelease耸采。
@selector(retain), @selector(release)之類的也同樣禁用。
如果需要管理釋放實(shí)例變量以外的資源工育,則可以實(shí)現(xiàn)dealloc方法
2虾宇、不能使用NSAllocateObject 和 NSDeallocateObject
3、不能在C結(jié)構(gòu)中使用對(duì)象指針
4如绸、id和* void不能隨意的使用
5嘱朽、不能使用NSAutoreleasePool對(duì)象,改為@autoreleasepool
6怔接、不能直接使用內(nèi)存空間
二搪泳、ARC引入了新的生命周期修飾詞
ARC介紹了對(duì)象的幾個(gè)新的生存周期修飾詞,還有弱引用扼脐。弱引用不會(huì)延長(zhǎng)它指向的對(duì)象的生存期岸军,當(dāng)沒(méi)有對(duì)對(duì)象的強(qiáng)引用時(shí)奋刽,自動(dòng)指向nil。
補(bǔ)充:autorelease 原理
https://blog.sunnyxx.com/2014/10/15/behind-autorelease/
https://juejin.im/post/5d807672f265da03c721d541
小總結(jié):
查詢得知:以 alloc, copy, ,mutableCopy和new這些方法會(huì)被默認(rèn)標(biāo)記為 __attribute((ns_returns_retained)) 艰赞,以這些方法創(chuàng)建的對(duì)象,編譯器在會(huì)在調(diào)用方法外圍要加上內(nèi)存管理代碼retain/release佣谐,所以其在作用域結(jié)束的時(shí)候就會(huì)釋放,而不以這些關(guān)鍵字開(kāi)頭的方法方妖,會(huì)被默認(rèn)標(biāo)記為_(kāi)_attribute((ns_returns_not_retained)),編譯器會(huì)在方法內(nèi)部自動(dòng)加上autorelease方法狭魂,這時(shí)創(chuàng)建的對(duì)象就會(huì)被注冊(cè)到自動(dòng)釋放池中,同時(shí)其釋放會(huì)延遲党觅,等到自動(dòng)釋放池銷毀的時(shí)候才釋放雌澄。