2013-04-11 49 views

回答

0

他指的是通過自我符號訪問您的@properties。 (取決於Xcode的版本)

用於在幕後被創建

@property (nonatomic,strong) MyClass myVar; 

@synthesize myVar = _myVar; 

- (MyVar *)myVar 
{ 
    return _myVar; 
} 

- (void)setMyVar:(MyClass *)myVar 
{ 
    _myVar = myVar; 
} 

這些方法,當屬性被定義和/或合成的:當合成的性質,該變量的getter和setter自動爲所創建

所以當你

self.myVar = 5; 

你實際上是在做[self setMyVar:5];

然而,有可能直接訪問變量,並通過使用下面的符號繞過二傳手

_myVar = 5; 

例子:

@property (nonatomic,strong) MyClass myVar; 

@synthesize myVar = _myVar; 


- (void)someMethod 
{ 
    // All do the same thing 
    self.myVar = 5; 
    [self setMyVar:5]; 
    _myVar = 5; 
} 

這篇文章的作者是建議您不要在的dealloc和init中使用getter和setter方法,但直接使用_myVar表示法訪問該變量。

看到這個答案的有關最佳實踐等進一步的信息,但它是一個值得商榷的問題:Why shouldn't I use Objective C 2.0 accessors in init/dealloc?

+2

這並不能解釋爲什麼*在init/dealloc中使用屬性訪問器可能存在問題(這是OP要求的)。 – 2013-04-11 12:12:20

+0

雖然這是一個主觀問題,所以提供更多背景可能會有所幫助。 – Tim 2013-04-11 12:33:57

1

我覺得作者應該更小心的命名約定。

@property (nonatomic, retain) NSString *something; 

應該綜合成

@synthesize something = _something; 

這種方式,你可以參考self.something使用存取方法或者_something使用該備份該屬性的伊娃。它不太容易出錯。

而關於你的問題。當你有一個存取器時,除了在該存取器方法中設置該屬性(如通知另一個對象或更新UI)之外,你可能還在做其他事情。你可能不想在init或dealloc上這樣做。這就是爲什麼你可能想直接訪問伊娃,但情況並非總是如此。

相關問題