通过类类别中的方法在类扩展中设置属性

时间:2013-10-11 18:21:17

标签: objective-c objective-c-category

我有一个类(SomeClass),我正在扩展并添加一个属性(propOne)。 我还想在此类上添加一个类别(CategoryName),以创建一个修改扩展中添加的属性的方法。

我收到一条编译错误消息[SomeClass setPropOne:] unrecognized selector...

我对objective-c很新 - 如何在类别中创建的方法修改通过扩展添加的属性?

我认为我想要做的事情最好用代码来解释:

@interface SomeClass ()

@property (nonatomic,weak) id propOne

@end

...
...


@implementation SomeClass (CategoryName)

- (void)someMethodWithParam:(id)param
{
 self.propOne = param;
}

@end

3 个答案:

答案 0 :(得分:0)

无法将@property添加到开箱即用的类别中。但是,有一种解决方法涉及创建这样的东西:

static const char kMyChar;

并通过以下方式将其绑定到类别(使其成为“关联对象”):

objc_setAssociatedObject(self, &kMyChar, alertWrapper, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

请查看here以获取“添加属性”到基于块的UIAlertView类别的良好示例的完整文档...

答案 1 :(得分:0)

只有在编译实现时类扩展是可见的,自动合成机制才能合成在类扩展中声明的属性。因此,如果您的示例中显示的类扩展位于 SomeClass.h SomeClass.m 中,则该属性将被合成。

否则,类扩展为(在这种情况下至少)不存在的属性提供声明,这就是当您尝试访问它时看到运行时异常的原因。要解决此问题,您可以在SomeClass (CategoryName)类别中自行实施访问者方法。

您可能遇到的问题是,给定的类无法将实例变量添加到另一个类。请参阅Alfie Hansen的答案,了解可能的解决方法。

答案 2 :(得分:0)

使用关联对象实现您想做的事 https://github.com/kissrobber/DProperty