標籤:雙擊 art main 就會 建立 匹配 設定 sni argc
自己主動釋放池@autorelease面試頻率可能會吧release還要高。
(1)在自己主動釋放池@autoreleasepool{}中alloc一個對象後(如p1)。仍然須要用[p1 autorelease];不過這個語句和[p1 release];不同。後者表示把p1的retainCount-1,而前者只表示把p1放到自己主動釋放池中返回一個self,自己主動釋放池結束銷毀時,統一對裡面的對象引用計數retainCount-1。
(2)@autoreleasepool{}能夠任意建立。也能夠嵌套使用。
(3)無論這個對象是在自己主動釋放池內還是外建立的,僅僅要在自己主動釋放池內寫一個[p1 autorelease];p1就會被放到自己主動釋放池中。
注意autorelease是一個方法。且僅僅有在自己主動釋放池中使用才有效。
(4)假設把一個對象反覆加到自己主動釋放池如[p1 autorelease];[p1 autorelease];。那麼會出錯。原因是:載入幾次。屆時自己主動釋放池就會用[p1 release];釋放幾次,可是因為這兩個載入的對象事實上是一個對象相同地址,所以第一次自己主動釋放正確,第二次自己主動釋放時發現已經被釋放了。所以p1就變成了野指標。
(5)下面是自己主動釋放池嵌套的使用規則和注意點。
#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * argv[]) { Person *p1=[[Person alloc]init]; @autoreleasepool { @autoreleasepool { [p1 autorelease]; }//在運行到此處時,p1被自己主動釋放 } //下面代碼有錯誤 @autoreleasepool { [p1 autorelease];//此時p1被增加進來 @autoreleasepool { [p1 autorelease];//被反覆載入進來。但仍然同一個 }//此處,p1被自己主動釋放了。所以第一次加進來的那個也被釋放了。由於是同一個對象 }//所以此處在調用[p1 release];時就出現報錯:野指標 return 0;}
(6)@autoreleasepool的應用:假設須要在方法中建立對象。並把這個對象作為返回值,那麼能夠在這種方法中使用[*** autorelease];把它增加到自己主動釋放池中。否則。直接用[*** release];來匹配alloc的話,在該方法中就已經把這個對象alloc和release了一遍相當於釋放了。那麼所謂的返回對象返回的時一個野指標(沒有指向不論什麼對象)。當然。調用這種方法的字碼頁須要寫在自己主動釋放池範圍內才生效。
(7)接上面。返回對象的那個方法中,建立對象不建議直接用類名,而是用self。否則假設存在子類調用會崩潰。
如Car *car1=[[self alloc]init];
(8)事實上諸如NSString *str1=[NSString stringWithFormat:@"%@",@"hello"];也是調用了一個方法,而且返回了一個字串對象。
比照(6)和(7)我們得知這個stringWithFormat應該也是順便返回了一個autorelease。
(9)在ARC機制中。我們用@property聲明的成員變數,建議用strong取代之前手動管理記憶體時的retain。儘管後者仍然能夠使用。由於我們在ARC中記憶體管理就是看是否有強指標指向對象,如有就不回收。如沒有就回收。
所以強指標是strong,相反是weak。而基礎資料型別 (Elementary Data Type)我們還是習慣用assign。
(10)儘管Xcode提供了非ARC轉換成ARC的,非常少有把整個非ARC轉換成ARC的。假設我們匯入第三方庫時。須要非ARC和ARC共存。即我們系統預設是ARC。我們須要讓系統不要去管這個非ARC的第三方庫,例如以下設定:雙擊響應的.m檔案。輸入-fno-objc-arc斷行符號就可以。
(11)順便。當出現兩個類循環參考的話(也就是A要包括B。B要包括A。即A對象要作為B的變數,B對象要作為A的變數),僅僅須要把一方的strong改成weak。而且在響應的.h檔案裡把#import ".h"改成Class ***。
假設由於改成Class ***而無法使用那個類的方法的話,僅僅須要在它的.m檔案裡#import“.h”檔案就可以,這個由於不是在.h檔案裡匯入所以不衝突。
【iOS開發-34】自己主動釋放池@autoreleasepool的使用注意事項以及ARC機制——面試必考內容