2010-02-11 47 views
3

我使用下面的代碼到displayValue方法添加到NSObject的:如何在Objective-C中將屬性添加到NSObject?

@interface NSObject (MyNSObjectAdditions) 
- (NSString*)displayValue; 
@end 


@implementation NSObject (MyNSObjectAdditions) 
- (NSString*)displayValue { 
    return self.description; 
} 
@end 

這個偉大的工程,但實際上我寧願有displayValue是隻讀屬性,而不是一個方法。

如果甚至有可能將displayValue轉換爲屬性而不是選擇器,那麼正確的語法是什麼?

回答

4

您只能使用類別將新方法添加到類中。如果你真的想添加新的實例變量,你將不得不繼承NSObject。

在任何情況下,向NSObject添加功能很少是一個好主意。你能解釋你想達到的目標嗎?

+4

我不同意你的看法。我已經向NSObject添加了很多次類別。這是一種非常有效的選擇,可以將行爲一次性添加到類樹中的所有內容中。你只需要小心不要打破任何現有的方法。 – NSResponder 2010-02-12 23:40:57

+1

也不同意其他觀點。如果你想沒有子添加新的實例變量,你可以使用這種技術:Objective-C的:添加屬性類別(http://stackoverflow.com/q/4597637/1804403) – Skotch 2013-05-30 21:17:28

+0

關聯的對象('objc_ { get,set} AssociatedObject')可以用作動態替換實例變量到對象的全功能替換。 – 2016-10-10 21:08:37

2

看起來像-displayValue方法不會向描述添加任何內容。你爲什麼想這樣做?

+0

默認情況下-displayValue返回-description,但這樣做可以讓我繼承-displayValue在對案件逐案基礎上的其他對象。 – emmby 2010-02-11 21:46:59

+0

爲什麼不按個案基礎重寫-description? – bobDevil 2010-02-11 22:15:27

+0

因爲重寫說明具有深遠的影響。代碼的其他部分可能依賴於以特定方式輸出的描述,我不想改變它。此外,從概念上講,我並沒有真正改變對象應該「看起來像什麼」,而是應該如何在這個特定的模塊(在這個例子中輸出html)中呈現它。 – emmby 2010-02-12 16:46:56

3

您可以在類別中有屬性。在不是class extensions(AKA類繼續)的類別中,不能使用@synthesize。但是,編寫支持方法很簡單。在你的情況,這個工程:

@interface NSObject (MyNSObjectAdditions) 
@property (readonly) NSString *displayValue; 
@end 

@implementation NSObject (MyNSObjectAdditions) 

- (NSString *)displayValue { 
    return self.description; 
} 

@end