我怎么知道指针是否是NSObject?

时间:2009-10-05 19:04:54

标签: objective-c xcode nsobject

我在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错误的访问错误。

我是否应该使用更好的测试来确定代表是否会回复我的消息?

3 个答案:

答案 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 */
};
* isa指向一个班级......某些班级。因此,您设置为委托的对象可能不存在或指向不良内存。