2012-10-06 26 views
3

如果我有這樣的特性:的Objective-C:正確的方式來傳遞一個屬性的引用轉換成方法調用

@property(strong, readwrite, nonatomic) NSDate* aProperty; 

,我想引用傳遞到另一種方法,是這些正確的:

if([AnotherClass aMethod:&(self.aProperty)]) { ... 
if([AnotherClass aMethod:&self.aProperty]) { ... 
+0

事實上,Xcode中拋出「的物業地址明示要求」 – ikevin8me

+2

實際上是一個錯誤,它不是Xcode,而是編譯器。 – 2012-10-06 16:17:57

回答

9

考慮您的示例:

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; 
2
aProperty 

已經是一個指針的NSDate對象,所以你只是通過沿着「通過引用調用」的指針值。

由於該項目被聲明爲指針,可以使用通過參考,

if([AnotherClass aMethod:aProperty]) { ... 

在原型是amethod方法...

- (BOOL) aMethod:(NSDate *) aParameter; 

(上面是,除非你真的真的想要傳遞一個指向屬性本身的指針 - 修改指向屬性本身的指針,在這種情況下,我會質疑您的設計)

+1

這不是真正的問題所在。我仍然同意你關於OP的設計存在根本上的缺陷,但問題是他想要另一種方法來修改一個變量,這個變量在你的答案中缺少一個間接的層次。 – 2012-10-06 16:19:48

10

您可以使用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]]; 
} 

我更喜歡使用的關鍵價值編碼。

+0

你的方法是可取的,因爲第一類可以在setter被設置時以及什麼值時登錄。在@Rob的解決方案中,原始類永遠不會知道該變量是否在後面發生變化。 –

+0

這兩個似乎都比這裏的其他人好得多。 – ArtOfWarfare

相關問題