将CGRect创建为关联对象?

时间:2015-02-08 09:32:00

标签: ios objective-c uibutton cgrect associated-object

我尝试为我的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];
}

当我NSLogdogButton.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}}

1 个答案:

答案 0 :(得分:3)

你正在努力避免继承UIButton的子类,这非常容易和快速。不要让它比必要的更复杂。

此外,NSValue是一个NSObject,应保留未分配。您的存储语义不正确,这可能是您遇到问题的原因。您的关联对象是一个对象,需要像对象一样保留。

使用OBJC_ASSOCIATION_RETAIN_NONATOMIC