一般來說,我想不同名稱的屬性指向相同的變量。聲明兩個屬性具有不同的名稱,將指向相同的變量
其原因是我希望我的類符合MKAnnotation,並且我希望title屬性具有與名爲name的其他屬性相同的值,對於我來說非常重要的是不要更改我的原始屬性的名稱(名稱)。
有沒有一個聰明的方式來這樣做,而不是有兩個對象,只是克隆到另一個?
一般來說,我想不同名稱的屬性指向相同的變量。聲明兩個屬性具有不同的名稱,將指向相同的變量
其原因是我希望我的類符合MKAnnotation,並且我希望title屬性具有與名爲name的其他屬性相同的值,對於我來說非常重要的是不要更改我的原始屬性的名稱(名稱)。
有沒有一個聰明的方式來這樣做,而不是有兩個對象,只是克隆到另一個?
yourObject.firstProperty = [[AClass alloc] init]; // ---> alloc or set to an existing object...
yourObject.secondProperty = yourObject.firstProperty;
這樣兩個屬性指向同一個分配的對象
相反,合成你只需要編寫自己的訪問器的屬性。你可以這樣做,如下所示。
在你的界面:
@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
注意:這將導致與鍵 - 值觀察是否發生突變的觀察者將只被通知的方法問題被稱爲,而不是實際價值的突變。
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關於其他方向的依賴關係。我不認爲這是有效的,即使它在實驗中似乎也不會依賴它。它很容易發生無限遞歸,或者框架簡單地忽略循環依賴(避免無限遞歸)。
有兩個指向相同變量的屬性。 '@synthesize a = var; @synthesize b = var;' –