【问题标题】:Why won't my delegate accept performSelectorOnMainThread:withObject:waitUntilDone:? [duplicate]为什么我的委托不接受 performSelectorOnMainThread:withObject:waitUntilDone:? [复制]
【发布时间】:2011-04-15 15:30:27
【问题描述】:

Xcode 4 在发送给我的委托的 performSelectorOnMainThread:withObject:waitUntilDone: 消息上给我编译器警告,但我不明白。

我的委托声明如下:

@property (nonatomic, assign) id <AccountFeedbackDelegate> delegate;

然后最终在主线程上执行:

[self.delegate performSelectorOnMainThread:@selector(didChangeCloudStatus) withObject:nil waitUntilDone:NO];

然而 Xcode 坚持给我:

警告:语义问题:找不到方法“-performSelectorOnMainThread:withObject:waitUntilDone:”(返回类型默认为“id”)

当然,代码编译并运行良好,但我不喜欢这个警告。当我像这样重新声明委托时,警告消失了,但我不喜欢解决方法:

@property (nonatomic, assign) NSObject <AccountFeedbackDelegate> *delegate;

我错过了什么?我做错什么了? 干杯,
EP

【问题讨论】:

    标签: objective-c multithreading delegates


    【解决方案1】:

    performSelectorOnMainThread:withObject:waitUntilDone: 在 NSThread.h 中的 NSObject 的类别中声明。由于您的变量是id 类型,因此编译器无法确定它是否可以响应为NSObject 定义的消息。与普通的 id 变量不同,当你的变量被声明为 id &lt;SomeProtocol&gt; 时,编译器会警告你。

    所以你确实应该将你的委托声明为NSObject &lt;AccountFeedbackDelegate&gt;

    PS:通过将协议声明为@protocol AccountFeedbackDelegate &lt;NSObject&gt; 来消除这种警告的“标准”方法在这里不起作用,因为performSelectorOnMainThread:withObject:waitUntilDone: 未在NSObject 协议中声明。

    【讨论】:

    • 感谢@Ole,这确实解释了它。我将继续使用 id 声明委托,但在调用 performSelectorOnMainThread:withObject:waitUntilDone: 方法之前将其转换为 NSObject。
    • NSObject *propertyName
    猜你喜欢
    • 1970-01-01
    • 2018-03-30
    • 2013-06-30
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    相关资源
    最近更新 更多