我尝试为我的CGRect
创建一个UIButton
属性作为关联对象,因此我不必为UIButton
创建子类只是为了这个。
基本上我添加了一个名为tapArea
的属性,但我在创建它时遇到了问题。这就是我到目前为止所做的:
@dynamic tapArea;
- (void)setTapArea:(CGRect)tapArea {
objc_setAssociatedObject(self, @selector(tapArea), [NSValue valueWithCGRect:tapArea], OBJC_ASSOCIATION_ASSIGN);
}
- (CGRect)tapArea {
return [objc_getAssociatedObject(self, @selector(tapArea)) CGRectValue];
}
当我NSLog
说dogButton.tapArea
时,记录器打印出{{0,0},{0,0}}
这是有道理的。当我尝试设置它时会出现问题。我得到了以下崩溃:
-[__NSCFString CGRectValue]: unrecognized selector sent to instance 0x14e65e80
我相信我在使用NSValue时遇到此错误,但我没有正确地将其撤回。我该如何修理我的吸气剂?
P.S。这就是我在类别标题文件中声明我的属性的方式:
@property (nonatomic, assign) CGRect tapArea;
另外,如何设置我的属性默认等于按钮的框架而不是{{0, 0}, {0, 0}}
?
答案 0 :(得分:3)
你正在努力避免继承UIButton的子类,这非常容易和快速。不要让它比必要的更复杂。
此外,NSValue是一个NSObject,应保留未分配。您的存储语义不正确,这可能是您遇到问题的原因。您的关联对象是一个对象,需要像对象一样保留。
使用OBJC_ASSOCIATION_RETAIN_NONATOMIC