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

epo*_*gee 6 multithreading delegates objective-c

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

我的代表被宣布为:

@property (nonatomic, assign) id <AccountFeedbackDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)

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

[self.delegate performSelectorOnMainThread:@selector(didChangeCloudStatus) withObject:nil waitUntilDone:NO];
Run Code Online (Sandbox Code Playgroud)

然而Xcode仍坚持给我:

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

当然代码编译并运行正常,但我不喜欢警告.当我像这样重新声明代表时,警告消失了,但我不喜欢这个解决方法:

@property (nonatomic, assign) NSObject <AccountFeedbackDelegate> *delegate;
Run Code Online (Sandbox Code Playgroud)

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

Ole*_*ann 19

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

所以你应该确实宣布你的代表为NSObject <AccountFeedbackDelegate>.

PS:通过声明协议@protocol AccountFeedbackDelegate <NSObject>在这里不起作用来摆脱这种警告的"标准"方法因为performSelectorOnMainThread:withObject:waitUntilDone:没有在NSObject协议中声明.