如果我有這樣的特性:的Objective-C:正確的方式來傳遞一個屬性的引用轉換成方法調用
@property(strong, readwrite, nonatomic) NSDate* aProperty;
,我想引用傳遞到另一種方法,是這些正確的:
if([AnotherClass aMethod:&(self.aProperty)]) { ...
if([AnotherClass aMethod:&self.aProperty]) { ...
如果我有這樣的特性:的Objective-C:正確的方式來傳遞一個屬性的引用轉換成方法調用
@property(strong, readwrite, nonatomic) NSDate* aProperty;
,我想引用傳遞到另一種方法,是這些正確的:
if([AnotherClass aMethod:&(self.aProperty)]) { ...
if([AnotherClass aMethod:&self.aProperty]) { ...
考慮您的示例:
if ([AnotherClass aMethod:&(self.aProperty)]) { ...
這顯然是行不通的,因爲點符號是有效的,使用getter存取方法。它相當於:
if ([AnotherClass aMethod:&[self aProperty]]) { ...
你可以很容易想象爲什麼編譯器對這個表示法有點困惑。合乎邏輯的選擇是參考伊娃。因此,(假設您正在使用該屬性的伊娃下劃線約定)它可能看起來像:
if ([AnotherClass aMethod:&_aProperty]) { ...
但是,有各種各樣的問題(繞過二傳手,具有約aMethod
問題需要__strong
屬性覆蓋默認__autoreleasing
,如討論的here等)。
所以,可能最好,只是有收到更新的局部變量,然後調用屬性的setter隨後到:
NSDate *date;
if ([AnotherClass aMethod:&date]) { ...
self.aProperty = date;
aProperty
已經是一個指針的NSDate對象,所以你只是通過沿着「通過引用調用」的指針值。
由於該項目被聲明爲指針,可以使用通過參考,
if([AnotherClass aMethod:aProperty]) { ...
在原型是amethod方法...
- (BOOL) aMethod:(NSDate *) aParameter;
(上面是,除非你真的真的想要傳遞一個指向屬性本身的指針 - 修改指向屬性本身的指針,在這種情況下,我會質疑您的設計)
這不是真正的問題所在。我仍然同意你關於OP的設計存在根本上的缺陷,但問題是他想要另一種方法來修改一個變量,這個變量在你的答案中缺少一個間接的層次。 – 2012-10-06 16:19:48
您可以使用KeyValue編碼。
只發送一個屬性的名稱作爲的NSString
- (void) method:(NSString*)propertyName
{
[self setValue:[NSNumber numberWithInt:2] forKey:propertyName];
}
也是屬性僅僅是方法(set和get),所以你可以通過選擇
SEL selector = @selector(setProperty:);
- (void) method:(SEL)selector target:(id)target
{
[target performSelector:selector withObject:[NSNumber numberWithInt:2]];
}
我更喜歡使用的關鍵價值編碼。
你的方法是可取的,因爲第一類可以在setter被設置時以及什麼值時登錄。在@Rob的解決方案中,原始類永遠不會知道該變量是否在後面發生變化。 –
這兩個似乎都比這裏的其他人好得多。 – ArtOfWarfare
事實上,Xcode中拋出「的物業地址明示要求」 – ikevin8me
實際上是一個錯誤,它不是Xcode,而是編譯器。 – 2012-10-06 16:17:57