2013-10-14 40 views
0

我已經聲明過的屬性:的XCode 4.5.2錯誤未使用的變量時,使用屬性

@property(弱,非原子)IBOutlet中的UILabel * statusLabel;

然後我像這樣使用它: statusLabel.text = plainText; 或 [statusLabel setText plainText];

在這兩種情況下,我得到的編譯器錯誤。「使用未聲明的標識符‘statusLabel’的;您的意思是否 _statusLabel」」其實,當我_statusLabel取代statusLabel,編譯器是幸福

我完全不解。 1.是,XCode的自動伊娃綜合_statusLabel,但我試圖使用屬性,而不是一個實例變量,爲什麼財產是不可見的?

  1. 使用。(點)是錯誤的,因爲我明白,點是屬性。爲什麼呢?

  2. 如果我手動指定合成不帶下劃線的var,代碼將起作用,但同樣,這意味着編譯器可以與變量一起使用,而不是使用屬性。

所以,這個組合的作品: @synthesize statusLabel = statusLabel; ... [statusLabel setText:plainText];這個不是: @synthesize statusLabel = _statusLabel; ... [statusLabel setText:plainText];

有人解釋嗎?非常感謝。 Serge

回答

1
@property (weak, nonatomic) IBOutlet UILabel *statusLabel; 

將生成一個名爲setStatusLabel的setter和一個getter statusLabel和一個_statusLabel。將不會有名爲statusLabel的變量,當您使用self和「。」時語法你真的調用setter/getter並且不直接訪問變量。如果你需要重寫屬性的setter,你需要直接使用這個變量,所以你不會創建一個不定式的遞歸循環。

// NOTE: WRONG! recursive infinitive loop 
- (void)setStatusLabel:(UILabel *)label 
{ 
    self.statusLabel = label; 
} 

// RIGHT way (in regards to avoiding infinitive recursion) 
- (void)setStatusLabel:(UILabel *)label 
{ 
    _statusLabel = label; 
} 

self.statusLabel = @""; 
[self setStatusLabel:[[UILabel alloc] init]]; 
_statusLabel = [[UILabel alloc] init]; 
UILabel *label = self.statusLabel; 
UILabel *label = [self statusLabel]; 
UILabel *label = _statusLabel; 

,如果你決定syntersize你財產你可以覆蓋變量名:

@syntersize statusLabel = myVarName;

而且可以覆蓋的setter /吸氣的名字是這樣的:

@屬性(非原子,弱,二傳手= mySetter,GET = myGet)IBOutlet中的UILabel * statusLabel;

此外,如果你決定synitesize屬性是這樣的: @syntersize statusLabel; 生成的變量將不帶「_」。

雖然我看到任何改變的setter/getter或變量名的默認名稱沒有真正的理由...

1

如果你不合成一個變量,你只能通過它自動合成_variable屬性或self.variable來訪問它。

否則你可以合成它。

使用它作爲_statusLabel並沒有錯。這很好。 您還可以使用的,而不是self.statusLabel_statusLabel

您可以讀到@synthesize確實here

0

,如果你允許的Xcode進行自動合成屬性,那麼你需要將它稱爲self.statuslabel

0

謝謝你的解釋,我現在明白了,這些都是有效的方法來訪問(第一3爲財產,後2 - 直接ivar):

[[self statusLabel] setText:plainText]; 
[self.statusLabel setText: plainText]; 
self.statusLabel.text = plainText; 

[_statusLabel setText:plainText]; 
_statusLabel.text = plainText; 
相關問題