我在Objective-C类中有一个指针需要发送消息。指针可能是任何东西,所以我需要确保它在发送之前它将响应我的消息。这是我用来检查的功能:
int delegatePreparedForSelector(id delegate, SEL aSelector) {
if (delegate
&& [delegate isKindOfClass:[NSObject class]]
&& [delegate respondsToSelector:aSelector]) {
return YES;
}
return NO;
}
问题是有时委托指针是struct objc-object *
,当我发送EXC_BAD_ACCESS
消息时,我收到isKindOfClass
错误的访问错误。
我是否应该使用更好的测试来确定代表是否会回复我的消息?
答案 0 :(得分:6)
等等,你真的是指指针可以是什么吗?就像一个void *
指向一块原始的malloc内存,或一个不是从NSObject派生的objc_object?如果确实如此,那么就无法安全地完成这项工作。这相当于说“如果不取消引用此指针,我怎么知道取消引用是安全的?”唯一的方法是拥有先验知识,无论什么传递给你,都没有给你一个坏指针。
您可以尝试编写一些信号处理程序代码来清理EXEC_BAD_ACCESS,但最终它会慢慢地工作,并且会掩盖许多其他真正的错误。实际上,您要么对要传递的内容有一些限制,要么需要重新构建项目的这一部分。
答案 1 :(得分:5)
听起来你的代表在电话会议之前被处理掉了,而不是这个代码有任何错误。
此外,您可以对参数实施协议实现,如:id<MyDelegateProtocol> delegate
,而不是仅使用裸ID。
答案 2 :(得分:-1)
指向类型struct objc_object的委托指针导致问题令人困惑,因为Obj-C中的所有对象都是类型(挖掘到obj-c对象):
struct objc_object
{
struct objc_class *isa;
/* extra stuff */
};