为什么我的委托不接受performSelectorOnMainThread:withObject:waitUntilDone:?

时间:2011-04-15 15:30:28

标签: objective-c multithreading delegates

Xcode 4给我发送给我的代表的performSelectorOnMainThread:withObject:waitUntilDone:消息的编译器警告,但是我没有得到它。

我的代表被宣布为:

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

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

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

然而Xcode继续给我:

  

警告:语义问题:方法'-performSelectorOnMainThread:withObject:waitUntilDone:'not found(返回类型默认为'id')

当然代码编译并运行正常,但我不喜欢警告。当我重新声明这样的代表时,警告就会消失,但我不喜欢这种解决方法:

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

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

1 个答案:

答案 0 :(得分:19)

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

所以你确实应该将你的代表声明为NSObject <AccountFeedbackDelegate>

PS:通过将协议声明为@protocol AccountFeedbackDelegate <NSObject>来摆脱此类警告的“标准”方法在此处不起作用,因为performSelectorOnMainThread:withObject:waitUntilDone:协议中未声明NSObject