【iOS開發-34】自己主動釋放池@autoreleasepool的使用注意事項以及ARC機制——面試必考內容

來源:互聯網
上載者:User

標籤:雙擊   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機制——面試必考內容

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.