gpt4 book ai didi

ios - `objc_setAssociatedObject` 和 `objc_getAssociatedObject` 不匹配

转载 作者:行者123 更新时间:2023-11-29 05:17:37 25 4
gpt4 key购买 nike

我只想向 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];

enter image description here

我在 Bugly 中遇到的崩溃是这个 NSInvalidArgumentException -[_UILabelStringContent doubleValue]: 无法识别的选择器发送到实例 0x2804fb280

enter image description here

那么为什么会发生这种情况。我只是设置了一个浮点值,但得到了一个_UILabelStringContent值

PS:我的项目是 swift 5.0,但我只是使用 Objective-C 运行时来添加额外的属性。

PS2:我在另一个Objective-C项目中使用了相同的代码,它不会崩溃。

PS3:并不总是崩溃。

PS4:我在 UIViewBaseLabel 中使用了此属性,但仅在 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:是由_cmdobjc_getAssociatedObject(self, _cmd)中进行崩溃调用吗??

最佳答案

- (void)setMaxWidth:(CGFloat)maxWidth 内,您正在创建 NSNumber 支持对象,该对象保存 的值CGFloat@(maxWidth) 缩写语法暗示。由于 NSNumberNSObject 的子类,因此您不应该使用 OBJC_ASSOCIATION_ASSIGN ,它对于具有由 ARC 处理的引用计数的类型无效(它是有效的)对于像Integer这样的值类型)。您应该使用 OBJC_ASSOCIATION_RETAIN 来代替。将您的代码更新为

- (void)setMaxWidth:(CGFloat)maxWidth {
objc_setAssociatedObject(self, @selector(maxWidth), @(maxWidth), OBJC_ASSOCIATION_RETAIN);
}

关于 PS6 部分 _cmd 是给定 Objective-C 方法主体中的选择器名称(内部表示为 char*)。它通过选择器作为每个方法调用的“隐藏”参数(从 obj-c 语法角度来看)传递。访问它不太可能导致崩溃,除非方法调用以某种方式存在格式错误。

关于ios - `objc_setAssociatedObject` 和 `objc_getAssociatedObject` 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59014089/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com