Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 是否可以使用不同的参数类型覆盖NSOperation的completionBlock属性?_Objective C_Cocoa_Objective C Blocks_Nsoperation - Fatal编程技术网

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;