创建 CGRect 作为关联 Object?

Creating a CGRect as an Associated Object?

我正在尝试为我的 UIButton 创建一个 CGRect 属性 作为关联的 object,这样我就不必子类化 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 时遇到了这个错误,但我没有正确地将其拉回。我该如何修复我的 getter?

P.S。这就是我在我的类别 header 文件中声明我的 属性 的方式:

@property (nonatomic, assign) CGRect tapArea;

此外,如何将我的 属性 默认设置为等于按钮的框架而不是 {{0, 0}, {0, 0}}

您非常努力地避免对 UIButton 进行子类化,这非常简单快捷。不要让它变得比必要的更复杂。

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

使用OBJC_ASSOCIATION_RETAIN_NONATOMIC