2009-10-05 89 views
2

我有一个需要发送消息的Objective-C类中的指针。指针可能是任何东西,所以我需要确保它在发送消息之前会响应我的消息。下面是我用做检查的功能:如何知道指针是否是NSObject?

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消息。

是否有更好的测试我应该用来确定委托人是否会回复我的消息?

回答

5

听起来好像你的委托在调用之前被抛弃了,而不是这个代码有任何必然的错误。

另外,您可以对参数执行协议实现,例如:id<MyDelegateProtocol> delegate而不是仅使用裸号。

+0

这是问题所在。当委托被解除分配并设置为'nil'时,它的类型被设置为'struct objc_object *'我在调试器中看到的。 – kubi 2009-10-05 21:22:43

+0

如果委托人为零,则上述情况不会崩溃.... – bbum 2009-10-05 22:11:43

+1

零与解除分配 – slf 2009-10-06 13:33:01

-1

委托指针指向型结构objc_object引起问题是混乱的,如在OBJ - C的所有对象都是类型的(挖入OBJ-C的对象):

struct objc_object 
{ 
    struct objc_class *isa; 
    /* extra stuff */ 
}; 

的* ISA指向一个班..一些班。因此,您设置为委托的对象可能不存在或指向错误的内存。

+0

不能使用@try捕捉信号('EXC_BAD_ACCESS')。 – 2009-10-05 20:41:47

+0

woops。你是对的。那么他将不得不承担责任并追查该虫是否存在。 – pxl 2009-10-05 20:46:35

6

等等,你真的指的是指针可以是任何东西吗?像void *指向一大块原始malloc'ed内存,或一个objc_object不派生自NSObject?如果确实如此,那么无法安全地进行这项工作。这相当于说“不废弃这个指针,我怎么知道解除引用是安全的?”唯一的办法就是有先验知识,无论传给你什么都不会给你一个不好的指针。

您可以尝试编写一些信号处理程序代码来清除EXEC_BAD_ACCESS,但最终它会慢慢地,很差地工作,并屏蔽大量其他实际的错误。实际上,你对传递的内容有一些限制,或者你需要重新设计你的项目的这一部分。

相关问题