2014-09-03 50 views
1

當我使用assign聲明一個合成的propery時,ARC是否會自動爲它創建一個匹配的ivar?我的屬性如下使用分配是否減少使用的內存量?

@property (nonatomic, assign) NSString *text: 

而且

- (NSString *)text { 
    return self.label.text; // label is a UILabel 
} 

- (void)setText:(NSString *)text { 
    self.label.text = text; 
} 

我從來沒有爲自動生成_text伊娃任何用途;當我忽略@synthesize text = _text還是未使用的ivar只是在未使用的內存中持續存在時,編譯器是否仍然創建此ivar?

回答

4

請勿使用assign這種方式。在這種特殊情況下,這可能無關緊要,但對調用者來說,這是非常令人困惑的,如果您更改了實現,它會產生非常糟糕的錯誤。

實現getter和setter的事實意味着編譯器不會生成ivar。這與您使用的內存管理屬性無關。這裏使用strong,因爲這是你實現的。您的標題應與您的實施相匹配。

+0

但是ivar仍然不會出現在符號表中嗎? – 2014-09-03 13:00:45

+1

它不應該。你看到一個嗎?更好的問題是它是否會從'class_copyIvarList()'出現在ivars列表中,但它不應該在那裏。如果是這樣,你應該打開一個編譯器缺陷。您還可以查看彙編輸出(在助手編輯器窗格中選擇「彙編器」)並親自查看。它不應該在那裏。 – 2014-09-03 13:03:33

+1

您也可以通過嘗試訪問'self._text'來更簡單地向自己證明。這應該無法編譯。 – 2014-09-03 13:04:27

1

只有當您沒有自己實施您的財產時,纔會自動爲您創建ivar。 而且@synthesize text = _text;是自動完成的,除非您爲getter和setter提供自己的實現,或者將該屬性合成到其他某個變量。例如:

@synthesize text; 

上面將合成text屬性text變量。

至於使用assign而不是複製,理論上使用較少的內存,但同時是危險的。如果使用可變字符串,如果在將字符串值分配給屬性後將其更改,則屬性值也會更改,這在大多數情況下不是您想要的。

+1

「,除非你爲getter和setter提供你自己的實現。」他確實實現了getter和setter。伊娃不會被創建。 – 2014-09-03 13:01:22

+0

@RobNapier確實,我編輯了答案。 – Adam 2014-09-03 13:11:36

1

您是否擔心每個實例的4-8(32/64位指針)字節的額外分配?使用分配,弱或強壯不會改變內存佔用。不管你使用什麼字符串都不被複制,引用總是指向同一個實例。區別僅在於assig弱不會增加對象的引用計數,所以通過省略ivar,您只需「保存」4-8個字節,具體取決於您使用的體系結構。