是什麼代碼之間的區別:訪問成員變量的目標C
[[self label] setText:@"Hello"];
[label setText:@"Hello"];
它是正確的,他們基本上如果我叫他們從類中的一樣嗎? 所以,如果我把它從另一個類將是:
[[someclass label] setText:@"Hello"];
someclass.label.text = @"Hello";
這是正確的嗎?這個自我使我感到迷惑。
是什麼代碼之間的區別:訪問成員變量的目標C
[[self label] setText:@"Hello"];
[label setText:@"Hello"];
它是正確的,他們基本上如果我叫他們從類中的一樣嗎? 所以,如果我把它從另一個類將是:
[[someclass label] setText:@"Hello"];
someclass.label.text = @"Hello";
這是正確的嗎?這個自我使我感到迷惑。
self
是一個指向已調用方法的對象的指針。
[label setText:]
可能會直接訪問實例變量。其他方法都通過訪問器方法。
是的雙方都是正確的。在
someclass.label.text = @"Hello";
您直接訪問屬性
而在
[[someclass label] setText:@"Hello"];
您正在使用的setter方法來設置這是由客觀的下你創建的文本屬性的值。
但我更喜歡set方法。但使用財產沒有任何錯誤。
自我只是向你展示標籤或你正在服用的任何東西屬於當前類的方式。 self會告訴你實體屬於你聲明它的同一個當前類,或者給它賦予一些值。
而且,如果您將該標籤分配給其他課程則是另一回事。
該混淆源於@synthesize
默認情況下會生成與該屬性同名的iVar。
該[[self label] setText:@"Hello"];
線將訪問該屬性label
並呼籲setText
對此。
[label setText:@"Hello"];
將訪問iVar label
並調用setText
。
不同之處在於,當您使用iVar時,您在屬性(原子,複製,保留等)上設置的任何設置都不會受到尊重。
如果您沒有任何特殊原因,通常只需使用該屬性即可。通過使用另一個名稱來合成iVar,可以更容易地記住這一點;
@synthesize label = _label;
所以你說'someclass.label.text' *不是*使用setter方法? – trojanfoe
沒有,因爲如果它設置沒有調用方法比它違反OOP的封裝方式。但是如果我的回答是傳達那個信息,那麼我不得不改變。 – CRDave
不,你的答案顯然是錯誤的。代碼'someclass.label.text'是'[[someclass label] setText:...];'的Objective-C 2.0語法糖。 – trojanfoe