內存管理之ARC

  ARC是編譯器的一個功能,與支持代碼靜態分析的機制同樣,當開發者編譯應用程序時,編譯器將檢查Objective-C對象指針(也叫引用)的用法,而後按照retain計數的規則,進行retain計數、釋放和自動釋放的檢查,確保對象在須要的時候可以正確存在,在不須要時從新分配。程序員

  在使用ARC後進行retain、release和autorelease將產生錯誤。在ARC 的幫助下,程序員能夠不用關注對象的retain計數,而將更多的關注點放在這些對象的關係上。對象之間的關係就是引用(其實就是對象指針)工具

  兩種類型的引用:強引用和弱引用指針

    1.強引用code

    默認狀況下都是強引用。假如一個對象被分配爲強引用,ARC則認爲該對象就在附近,而且retain也是隱式的。假如將引用改變爲一個新的值,舊的對象被釋放,新的對象被retain。對象

  2.弱引用內存

    弱引用於舊的手動引用計數指針類似:沒有隱式的retain,指針值只在內存在修改。然而這樣的引用一直是引發程序崩潰的緣由。假如指針沒有被retain,這個對象就被從新分配,那麼將留下一個壞指針,在之後使用時就是一個潛在的引發崩潰的緣由。ARC解決這個問題的方法是指針指向的對象被從新分配時,自動將弱引用設爲nil,這就是所謂的「zeroing weak reference」.弱引用通常用來解決retain循環的問題。開發

注意:只有使用ARC編譯的類才能夠對其設置弱引用,若是須要對一個弱引用變量賦值,但這個類不支持弱引用的話,程序將拋出異常。所以,可以使用__unsafe_unretained修飾符來代替__weak修飾符。編譯器

  ARC補充知識it

    使用ARC機制的代碼無須修改,就能與手動引用計數的代碼一塊兒使用。事實上,在單個文件基礎上才能使用ARC。編譯

    Xcode提供了從已有代碼向ARC機制轉換的工具,這個工具在Edit菜單中找到,Refactor->Convert to Objective-C Automatic Reference Counting下

    儘管ARC代碼能夠運行在Mac OS X 10.6和iOS 4上,但這些平臺並不支持弱引用的使用

    儘管Objective-C在不少狀況下能夠與C語言一塊兒混合使用,可是ARC並不容許C語言結構體包含對象指針

    屬性命名不能以new開始。

    在ARC下,調用retain、release、autorelease或者dealloc(如with [super dealloc])將產生錯誤,也不能重載retain、release或者autorelease方法。

相關文章
相關標籤/搜索