【发布时间】:2019-11-24 02:19:41
【问题描述】:
我只想像这样给UIView添加一个属性,
#import "UIView+Extension.h"
#import <objc/runtime.h>
@implementation UIView (Extension)
- (void)setMaxWidth:(CGFloat)maxWidth {
objc_setAssociatedObject(self, @selector(maxWidth), @(maxWidth), OBJC_ASSOCIATION_ASSIGN);
}
- (CGFloat)maxWidth {
return [objc_getAssociatedObject(self, _cmd) doubleValue];
}
@end
但有时有用,有时会崩溃。
我在 XCode 中得到的崩溃信息是这一行 return [objc_getAssociatedObject(self, _cmd) doubleValue];。
我在 Bugly 中遇到的崩溃是 NSInvalidArgumentException -[_UILabelStringContent doubleValue]: unrecognized selector sent to instance 0x2804fb280。
那么为什么会发生这种情况。我只是设置了float value,但得到了_UILabelStringContent value。
PS:我的项目是 swift 5.0,但我只是使用 Objective-C 运行时添加额外的属性。
PS2:我在另一个Objective-C项目中使用了相同的代码,它不会崩溃。
PS3:并不总是崩溃。
PS4:我在UIView 和BaseLabel 中使用了这个属性,但只在BaseLabel 中崩溃。
PS5:我用它来更新框架,我在BaseLabel这样使用它。
override func sizeToFit() {
super.sizeToFit()
if self.maxWidth > 0 {
if numberOfLines != 1 {
let size = self.sizeThatFits(CGSize(width: maxWidth, height: CGFloat.greatestFiniteMagnitude))
self.size = size
} else {
if self.size.width > maxWidth {
self.size.width = maxWidth
}
}
}
}
PS6:_cmd 在objc_getAssociatedObject(self, _cmd) 中的崩溃调用??
【问题讨论】:
-
看起来关联的对象正在被释放,并且内存被其他对象重用了。尝试启用 NSZombie 调试以确认。
标签: ios objective-c swift crash