2010-02-11 82 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