2014-09-11 117 views
0

我有一個屬性設置爲一個對象實例在我的課志願於輔助屬性

@property(nonatomic, strong) MyObject *myObject; 

我露出一個輔助屬性。

@property(nonatomic, assign, readonly) BOOL hasMyObject 

這確實

return self.myObject != nil; 

我需要hasMyObject是國際志願者組織兼容的(我用它RAC)。爲了解決這個問題,我現在打電話:

- (void)app_setMyObject:(MyObject*)myObject 
{ 
    [self willChangeValueForKey:@keypath(self.hasMyObject)]; 
    self.myObject = myObject; 
    [self didChangeValueForKey:@keypath(self.hasMyObject)]; 
} 

每次我設置myObject。

通過這種方式,觀察者可以知道hasMyObject何時發生變化。
我的問題是:
1.這是好嗎
2.有沒有更好的方法來做到這一點?


爲什麼我會這樣做呢?
爲什麼不只是使用myObject屬性?

這是一個API設計的東西。 myObject屬性是內部屬性,不應公開公開,myObject僅在類中設置。

回答

3

有一個更好的辦法:

+ (NSSet *)keyPathsForValuesAffectingHasMyObject { 
    return [NSSet setWithObject:@keypath(ClassName.new, myObject)]; 
} 

當然,ClassName.new實際上從來不評價(看看@keypath擴張),但它是得到一個類的方法實例的keyPath的唯一途徑。

+0

感謝您指出ClassName.new永遠不會被評估。 – Karmeye 2014-09-12 13:36:38