我正在上一堂课,给出了object
目标,一个selector
观察,以及displayTitle
将输出以下格式的字符串:@"displayTitle: object.selector"
。然后它通过 KVO 注册自己,以便任何时候value
of object.selector
更改时,它可以通知视图控制器更新视图。我使用它作为一种抽象且可重用的方式来向用户显示对象的各种属性的描述。
当我尝试获取的值时object.selector
,我做不到[object performSelector:selector]
因为当您将 PerformSelector 与动态选择器一起使用时,LLVM 会出现错误 https://stackoverflow.com/questions/7043999/im-writing-a-button-class-in-objective-c-with-arc-how-do-i-prevent-clangs-m。
所以,我确实做了什么这个答案 https://stackoverflow.com/a/7073899/2564682建议:我用过objc_msgSend(object, selector)
.
- (instancetype)initWithSelector:(SEL)selector onObject:(NSObject*)object displayTitle:(NSString*)displayTitle {
self = [super init];
if (self) {
id value;
if ([object respondsToSelector:selector) {
// Used objc_msgSend instead of performSelector to suppress a LLVM warning which was caused by using a dynamic selector.
value = objc_msgSend(object, selector);
} else {
return nil;
}
[self setItemDescription:[NSString stringWithFormat:@"%@: %@", displayTitle, value]];
}
return self;
}
我得到了一个EXC_BAD_ACCESS
!
正如你在屏幕截图中看到的,我确保
正在做[object selector]
works.
这是怎么回事?我该如何解决?
你分配你的结果objc_msgSend
调用类型变量id
因此 ARC 启动并尝试保留生成的对象(崩溃发生在objc_retain
正如您在左侧堆栈中看到的那样)。然而,结果不是一个对象,而是一个值为 8 的整数,即objc_retain
需要成为一个指针。但是没有这么低的有效指针,所以你得到EXC_BAD_ACCESS
.
只需更改类型即可value
to be NSUInteger
(或任何其他非对象类型)。但要确保所有潜力selector
s 返回相同类型的数据。或者,确保始终返回一个对象(或nil
),可以由 ARC 保留。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)