如何向Objective-C中的NSObject添加属性?

如何向Objective-C中的NSObject添加属性?,objective-c,Objective C,我使用以下代码向NSObject添加displayValue方法: @interface NSObject (MyNSObjectAdditions) - (NSString*)displayValue; @end @implementation NSObject (MyNSObjectAdditions) - (NSString*)displayValue { return self.description; } @end 这非常有效,但实际上我更希望displayValue是一

我使用以下代码向NSObject添加
displayValue
方法:

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


@implementation NSObject (MyNSObjectAdditions)
- (NSString*)displayValue {
    return self.description;
}
@end
这非常有效,但实际上我更希望displayValue是一个只读属性,而不是一个方法


如果可能的话,将
displayValue
转换为属性而不是选择器的正确语法是什么?

看起来-displayValue方法没有向-description添加任何内容。为什么要这样做?

只能使用类别向类添加新方法。如果您真的想添加新的实例变量,则必须将NSObject子类化


在任何情况下,向NSObject添加功能都不是一个好主意。你能解释一下你想要实现什么吗?

你可以在类别中拥有属性。在不是的类别(又名类延续)中,不能使用@synthesis。但是,编写支持方法很简单。在您的情况下,这是有效的:

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

@implementation NSObject (MyNSObjectAdditions)

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

@end

默认情况下,-displayValue返回-description,但这样做允许我在其他对象中根据具体情况对-displayValue进行子类化。为什么不根据具体情况重写-description呢?因为重写description会产生深远的影响。代码的其他部分可能依赖于以特定方式输出的描述,我不想改变这一点。此外,从概念上讲,我并没有真正改变一个对象的“外观”,只是改变了它在这个特定模块中的呈现方式(在本例中输出html)。我经常覆盖
description
以保留自定义信息。如果您熟悉Java,您可以把它想象成
.toString
,本质上是对象格式化转储的存根。我想说,为HTML呈现创建另一个方法是正确的。让代码依赖于从-description获得的字符串的内容是一个非常糟糕的想法。那个方法是为了调试的目的,我不同意你的看法。我已经多次向NSObject添加类别。这是一个非常有效的选项,可以同时向类树中的几乎所有内容添加行为。你只需要注意不要破坏任何现有的方法。也不同意另一点。如果您想添加新的实例变量而不需要子类化,可以使用这种技术:关联对象(
objc{get,set}AssociatedObject
)可以用作动态向对象添加实例变量的全功能替换。