Objective c 是否可以使用不同的参数类型覆盖NSOperation的completionBlock属性?
本书列出了一个示例,其中在Objective c 是否可以使用不同的参数类型覆盖NSOperation的completionBlock属性?,objective-c,cocoa,objective-c-blocks,nsoperation,Objective C,Cocoa,Objective C Blocks,Nsoperation,本书列出了一个示例,其中在NSOperation子类中,他覆盖了completionBlock属性: @property (copy) void (^completionBlock)(void) NS_AVAILABLE(10_6, 4_0); 与 在10.10下的Xcode 6中,会导致以下警告: 属性“completionBlock”上的“原子”属性与从“NSOperation”继承的属性不匹配 及 属性类型“ExportCompletionBlock”(又名“void(^)(NSDat
NSOperation
子类中,他覆盖了completionBlock
属性:
@property (copy) void (^completionBlock)(void) NS_AVAILABLE(10_6, 4_0);
与
在10.10下的Xcode 6中,会导致以下警告:
属性“completionBlock”上的“原子”属性与从“NSOperation”继承的属性不匹配
及
属性类型“ExportCompletionBlock”(又名“void(^)(NSData*\u strong,NSError*\u strong)”与从“NSOperation”继承的类型“void(^)(void)”不兼容
现在我想知道我应该如何看待这些警告。原子性属性如何?
尽管有警告,仍可以更改参数吗?
是否有另一个更好的解决方案不涉及更改块参数 原子性属性呢 从
原子的
到非原子的
确实令人困惑。NSO操作是一个需要原子属性的地方。除非你有很好的理由,否则我会坚持使用原子的
是否可以不顾警告更改参数
警告的存在是有原因的。completionBlock
属性预期会以某种方式工作,如果以某种方式使用其原始签名(self.completionBlock()
)而不是重新定义的签名(self.completionBlock(jsonData,error)
)调用它,则您的应用程序将崩溃
是否有另一个更好的解决方案不涉及更改块参数
不要重新定义completionBlock
。您不必使用completionBlock
,而是使用其他名称创建新属性。例如,在子类中,可以使用exportCompletionBlock
:
@property (atomic, copy) ExportCompletionBlock exportCompletionBlock;
然后,在
-main
中,当操作完成时,调用self.exportCompletionBlock(jsonData,error)
,而不是self.completionBlock(jsonData,error)
,“如果不强制使用completionBlock,请使用其他名称创建一个新属性。”这似乎有效。但是我怎么会知道呢?另外,completionBlock
上的文档说:“在iOS 8及更高版本和OS X v10.10及更高版本中,完成块开始执行后,此属性设置为nil。”我自己的块属性是否也会使用其他名称出现这种情况?@MartinW我不知道如何回答您的第一个问题。您可以在子类中控制-main
中的所有内容,因此可以随心所欲。如果不调用-completionBlock
,则它是一个未使用的属性。@MartinW至于第二个问题,NSOperation
不知道子类的属性。如果值被更改,我会非常惊讶。我的第二个问题更关心的是:我是否必须对我的自定义exportCompletionBlock
属性执行其他操作,这是NSOperation对completionBlock
属性执行的操作,我不知道。目前,我所做的只是设置exportCompletionBlock
,然后在我的main
方法的末尾调用它。Jeffery Thomas写道:“你控制子类中-main中的所有内容……如果你不调用-completionBlock,那么它就是一个未使用的属性。”这并不完全正确:如果NSOperations的isFinished属性设置为true,则会自动调用implemented completionBlock。
@property (atomic, copy) ExportCompletionBlock exportCompletionBlock;