2

我在需要向其发送消息的目标 C 类中有一个指针。指针可能是任何东西,所以我需要确保它会在我发送消息之前响应我的消息。这是我用来进行检查的功能:

int delegatePreparedForSelector(id delegate, SEL aSelector) {
    if (delegate 
        && [delegate isKindOfClass:[NSObject class]]
        && [delegate respondsToSelector:aSelector]) {
        return YES;
    }
    return NO;
}

问题是有时委托指针是 astruct objc-object *并且我在发送消息EXC_BAD_ACCESS时遇到错误的访问错误。isKindOfClass

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

4

3 回答 3

6

等等,你真的是说指针可以是任何东西吗?就像void *指向一块原始的 malloc'ed 内存,或者不是从 NSObject 派生的 objc_object?如果情况确实如此,那么就没有办法安全地进行这项工作。这相当于说“如果不取消引用这个指针,我怎么知道取消引用是安全的?” 唯一的方法是先验地知道传递给你的任何东西都没有给你一个错误的指针。

您可以尝试编写一些信号处理程序代码来清理 EXEC_BAD_ACCESS,但最终它会运行缓慢、效果不佳,并掩盖许多其他真正的错误。实际上,您要么对传入的内容有一些限制,要么需要重新设计项目的这一部分。

于 2009-10-05T20:52:27.860 回答
5

听起来您的代表在通话之前就被处理掉了,并不是说这段代码有任何问题。

此外,您可以像这样对参数强制执行协议实现:id<MyDelegateProtocol> delegate而不仅仅是使用裸 id。

于 2009-10-05T20:00:59.037 回答
-1

指向导致问题的类型 struct objc_object 的委托指针令人困惑,因为 Obj-C 中的所有对象都是类型(挖掘 obj-c 对象):

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

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

于 2009-10-05T20:36:26.343 回答