2012-08-29 26 views
10

可能重複自我的用法和下劃線(_):
How does an underscore in front of a variable in a cocoa objective-c class work?的iOS:具有可變

我一直很困惑,使用自己或與變量名下劃線合成它像後如下:

In .h file: 
@property(nonatomic, strong) NSMutableArray *users; 

In .m file: 
@synthesize users = _users; 

根據我的理解,當我使用self.users時,操作系統將確保rel在集合方法中簡化先前分配的內存,所以我們不需要明確照顧。

_users是用戶的實例變量,應該在訪問用戶變量時通常使用。如果我使用_users來更改它的值,那麼它將不會觸發KVO委託,這將不會通知觀察用戶值更改的班級。

此外,self.users允許方法名像下面區分虛擬變量,

- (void)assignUsers:(NSMutableArray*)users { 
     self.users = users; 
} 

可能有人請告訴我,如果有什麼事,我理解錯誤或缺失而使用_users或self.users。謝謝。

+0

嗨@qegal我經歷過那個線程,如果你看過我的問題,大部分觀點都是結論點,但我無法得到的是什麼時候使用什麼! – applefreak

回答

8

我認爲它有助於考慮屬性如何(或可能)由編譯器實現。

當你寫self.users = array;當你寫array = self.users;的編譯器編譯這array = [self users];

@synthesize增加伊娃到對象的編譯器編譯這[self setUsers:array];除非你加入它自己),並實現了-users-setUsers:存取方法你(除非你提供自己的

如果您使用ARC-setUsers:看起來是這樣的:如果你使用MRC

- (void)setUsers:(NSArray *)users 
{ 
    _users = users; // ARC takes care of retaining and release the _users ivar 
} 

(即ARC未啓用),-setUsers:看起來像*:

- (void)setUsers:(NSArray *)users 
{ 
    [users retain]; 
    [_users release]; 
    _users = users; 
} 

* - 注意,這是一個簡化的,非原子實現-setUsers:

+0

謝謝尼克! – applefreak

+0

這個話題的唯一答案就是從引用計數角度與這種優雅的區別。優秀。 – Ash

31

當您使用self.users時,您通過setter或getter訪問屬性。

當您使用_users時,您直接跳過setter或getter訪問屬性。


這裏是它的一個很好的示範:

- (void)setUsers:(id)users { 
    self.users = users; // WRONG : it causes infinite loop (and crash), because inside the setter you are trying to reach the property via setter 
} 

- (void)setUsers:(id)users { 
    _users = users; // GOOD : set your property correctly 
} 

這是在吸氣的情況下,點爲好。


一下基本的內存管理(在MRRARC情況下):了iOS將dealloc的對象,如果沒有它保持它活着更強大的指針,無論你如何釋放的指針對象。

+3

親愛的**選民**!我很榮幸得到一些關於你的手爲什麼在低位選舉按鈕上方搖晃的反饋,因爲 - 你信不信 - 我不是一個心智讀者。謝謝! – holex

+0

我不確定你的意思是:_「你表現出濫用」自我「和......」_,請你詳細說明一下嗎? _good演示_顯示了__difference__繞過並調用setter中的_same_ setter,這會導致無限遞歸循環,並在堆棧溢出時崩潰 - 因此最後一種方法是避免在運行時導致無限循環。 – holex

2

是的,這是非常正確的。幾個小點:

iOS不會因爲使用點符號而自動釋放對象。當屬性被聲明爲copyretain(或ARC中的strong)時,它釋放一個對象。例如,如果您使用的是非ARC代碼,並且該屬性聲明爲assign,則它不會釋放該對象。使用最新版本的開發人員工具鏈(Xcode 4.4+),您不再需要手動合成屬性 - 它們會自動合成(使用前導下劃線)。

+0

謝謝吉姆。我嘗試過使用iOS 6的Xcode 4.4,並且它不需要綜合屬性,但是該應用程序可以在較低版本的iOS上工作嗎? – applefreak

+1

是 - 來自官方文檔:[默認的'@ synthesize'功能不需要特殊的SDK或運行時支持。](http://developer.apple.com/library/ios/#documentation/DeveloperTools/Conceptual/WhatsNewXcode/Articles /xcode_4_4.html#//apple_ref/doc/uid/TP40011649-SW11)這樣的問題,你應該閱讀文檔。 – Jim