2012-09-28 177 views
0

是什麼代碼之間的區別:訪問成員變量的目標C

[[self label] setText:@"Hello"]; 
[label setText:@"Hello"]; 

它是正確的,他們基本上如果我叫他們從類中的一樣嗎? 所以,如果我把它從另一個類將是:

[[someclass label] setText:@"Hello"]; 
someclass.label.text = @"Hello"; 

這是正確的嗎?這個自我使我感到迷惑。

回答

1

self是一個指向已調用方法的對象的指針。

[label setText:]可能會直接訪問實例變量。其他方法都通過訪問器方法。

0

是的雙方都是正確的。在

someclass.label.text = @"Hello"; 

您直接訪問屬性

而在

[[someclass label] setText:@"Hello"]; 

您正在使用的setter方法來設置這是由客觀的下你創建的文本屬性的值。

但我更喜歡set方法。但使用財產沒有任何錯誤。

+0

所以你說'someclass.label.text' *不是*使用setter方法? – trojanfoe

+0

沒有,因爲如果它設置沒有調用方法比它違反OOP的封裝方式。但是如果我的回答是傳達那個信息,那麼我不得不改變。 – CRDave

+2

不,你的答案顯然是錯誤的。代碼'someclass.label.text'是'[[someclass label] setText:...];'的Objective-C 2.0語法糖。 – trojanfoe

0

自我只是向你展示標籤或你正在服用的任何東西屬於當前類的方式。 self會告訴你實體屬於你聲明它的同一個當前類,或者給它賦予一些值。

而且,如果您將該標籤分配給其他課程則是另一回事。

0

該混淆源於@synthesize默認情況下會生成與該屬性同名的iVar。

[[self label] setText:@"Hello"];線將訪問該屬性label並呼籲setText對此。

[label setText:@"Hello"];將訪問iVar label並調用setText

不同之處在於,當您使用iVar時,您在屬性(原子,複製,保留等)上設置的任何設置都不會受到尊重。

如果您沒有任何特殊原因,通常只需使用該屬性即可。通過使用另一個名稱來合成iVar,可以更容易地記住這一點;

@synthesize label = _label;