【问题标题】:Creating a CGRect as an Associated Object?创建一个 CGRect 作为关联对象?
【发布时间】:2015-02-08 09:31:59
【问题描述】:

我正在尝试为我的UIButton 创建一个CGRect 属性作为关联对象,这样我就不必为此子类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?

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

@property (nonatomic, assign) CGRect tapArea;

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

【问题讨论】:

  • objc_getAssociatedObject(self, @selector(tapArea)) 可能正在返回 NSString,因为该错误表明您正在尝试在 NSString 上执行 CGRectValue。我建议您也发布您的 objc_getAssociatedObject 方法以获得更彻底的答案。
  • 我想了这么多,除了我尝试使用CGRectFromString(),但似乎无法让它工作,没有它抛出一个内联错误。
  • @LyndseyScott objc_getAssociatedObject 是一个运行时方法:)
  • 好的,我会在文档中找到它。

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


【解决方案1】:

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

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

使用OBJC_ASSOCIATION_RETAIN_NONATOMIC

【讨论】:

  • 完美的解释。感谢您的提示。在这一点上你是对的(看到我在 UIButton 上有几个类别),最好只对它进行子类化。话虽如此,OBJC_ASSOCIATION_RETAIN_NONATOMIC 工作得很好。 :D
  • 你不应该继承 UIButton:stackoverflow.com/questions/13202161/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-07
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
相关资源
最近更新 更多