0

我正在尝试CGRect为我的 's 创建一个属性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 之前遇到了这个错误,但我没有正确地把它拉回来。如何修复我的吸气剂?

PS这就是我在类别头文件中声明我的属性的方式:

@property (nonatomic, assign) CGRect tapArea;

另外,我怎样才能将我的属性设置为默认等于按钮的框架而不是{{0, 0}, {0, 0}}

4

1 回答 1

3

您正在非常努力地避免继承 UIButton,这非常简单快捷。不要让它比必要的更复杂。

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

利用OBJC_ASSOCIATION_RETAIN_NONATOMIC

于 2015-02-08T09:51:43.207 回答