2012-05-02 62 views
1

一般來說,我想不同名稱的屬性指向相同的變量。聲明兩個屬性具有不同的名稱,將指向相同的變量

其原因是我希望我的類符合MKAnnotation,並且我希望title屬性具有與名爲name的其他屬性相同的值,對於我來說非常重要的是不要更改我的原始屬性的名稱(名稱)。

有沒有一個聰明的方式來這樣做,而不是有兩個對象,只是克隆到另一個?

+0

有兩個指向相同變量的屬性。 '@synthesize a = var; @synthesize b = var;' –

回答

-2
yourObject.firstProperty = [[AClass alloc] init]; // ---> alloc or set to an existing object... 

yourObject.secondProperty = yourObject.firstProperty; 

這樣兩個屬性指向同一個分配的對象

1

相反,合成你只需要編寫自己的訪問器的屬性。你可以這樣做,如下所示。

在你的界面:

@interface Student 
{ 
    NSString *_name; 
} 

@property (readonly, nonatomic) NSString *firstName; 
@property (readonly, nonatomic) NSString *lastName; 

@end 

在您的實現:

@implentation Student 

- (NSString *)firstName 
{ 
    return _name; 
} 

- (NSString *)lastName 
{ 
    return _name; 
} 

@end 

注意:這將導致與鍵 - 值觀察是否發生突變的觀察者將只被通知的方法問題被稱爲,而不是實際價值的突變。

1

HotLicks和TheSaad的問題與答案有關鍵值觀察(KVO)一致。如果有什麼東西正在觀察你的name屬性,你需要告知他們,如果別的東西叫做setTitle: setter。反之亦然。我會推薦@synthesize -ing你的一個屬性照常。例如,我假設name就是這樣完成的。然後,你需要做其他的,title在這種情況下,通過給該屬性加告訴志願有關的依賴:

- (void) setTitle:(NSString*)newTitle 
{ 
    self.name = newTitle; 
} 

- (NSString*) title 
{ 
    return self.name; 
} 

+ (NSSet *)keyPathsForValuesAffectingTitle 
{ 
    return [NSSet setWithObject:@"name"]; 
} 

對於最後的方法的理解,閱讀文檔的+[NSKeyValueObserving keyPathsForValuesAffectingValueForKey:]

你不能只是@synthesize既指向同一個實例變量(如_name),然後提供剛+keyPathsForValuesAffectingTitle方法來通知KVO是title取決於name,因爲這不會讓name觀察家知道什麼時候setTitle:已被調用。您可能會試圖通過提供+keyPathsForValuesAffectingName來告訴KVO關於其他方向的依賴關係。我不認爲這是有效的,即使它在實驗中似乎也不會依賴它。它很容易發生無限遞歸,或者框架簡單地忽略循環依賴(避免無限遞歸)。

相關問題