我有一个类(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
答案 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