2013-05-07 84 views
2

我仍在學習CocoaTouch的一些細微差別。在ARC環境中爲float,int等類型內部生成什麼類型​​的getters/setters?ARC環境下的Setters和Getters

我知道,如果該屬性是在非ARC對象我可能有這樣的事情:

- (NSURL *)url { 
    if (_url == nil) 
    _url = [[MyURL alloc] initWithURL:url]; 
    return _url 
} 

- (void)setUrl:(NSURL *)theUrl { 
    if (theUrl != _url) { 
     [_url release]; 
     _url = [theUrl retain]; 
    } 
} 

,而是基於一個ARC環境釋放和保留,不能使用。在這種情況下,ARC環境會自動創建什麼樣的getter/setter。

那麼像float,int等標量類型呢?

回答

3

一對夫婦的想法:

  1. 的存取方法基本數據類型(intbool等)(getter和setter)很像標準的存取方法的對象,唯一的區別在於沒有內存管理語義,因爲除了在對象的上下文中它們沒有任何意義。因此,您將看不到具有這些基本數據類型的strongweak。因此,retain的概念也不適用。

  2. 在幕後,系統爲在ARC中聲明爲strong屬性的對象生成setter,與非ARC代碼中對象的retain屬性的setter不同。它增加了保留計數(又稱「保持強有力的參考」)。現在,很明顯,如果你是爲你的strong物業自己寫的ARC二傳手(你真的不應該這樣做),你就不會被編寫一行代碼,說retain,但是編譯器有效地這樣做,你的背後場景。

  3. 我不太確定你的getter方法,因爲它不太合理。一般來說,getter不會爲你做任何allocinit

  4. 你的二傳手更接近一點(我認爲這是爲@property宣佈爲retain)。顯然,自動合成的制定者會自動拿起記憶壽命限定詞(例如retainassigncopy與...),並生成相應的代碼給你,所以最好還是就讓它做自己的事。

  5. 順便說,實際的系統產生的制定者也將包括志願(key-value-notification)調用了。您不必擔心KVO是什麼,但關鍵在於您不希望自己的代碼散佈在自己手寫的setter方法中,因爲當您開始使用KVO時,您會後悔這麼做。這是讓編譯器綜合它自己的存取方法的另一個原因。

+0

3.對我來說很有意義,它只是一個懶洋洋地初始化吸氣 – 2013-05-08 05:16:17

+0

感謝!!!!!!!!!!!!! – SpaceDog 2013-05-08 09:25:42

+0

@Catfish_Man也許「沒有意義」太強了。但是有一個getter叫做'url',它用變量(ivar?global?)設置ivar'_url'。)看起來並不像DD,對我來說這是一個非常好的實現(實際上,由於很多原因,不僅僅是因爲命名問題),所以稱爲「url」。如果它是一個計算成本很高或佔用大量內存的資源,我會使用懶惰初始化,但在這裏看起來並不謹慎,如果我這樣做了,我會傾向於稍微不同的實現。 – Rob 2013-05-08 15:41:23

4

ARC處理所有的釋放和保留給你。你應該使用合成的getter和setter,但是如果你沒有這樣做,只需設置ivar並刪除所有其他代碼即可。

相關問題