Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.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 是否可以使用方法代替块?_Objective C_Objective C Blocks - Fatal编程技术网

Objective c 是否可以使用方法代替块?

Objective c 是否可以使用方法代替块?,objective-c,objective-c-blocks,Objective C,Objective C Blocks,在Objective-C中,是否可以使用方法代替块 例如,与定义块然后调用方法不同: [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *responseData

在Objective-C中,是否可以使用方法代替块

例如,与定义块然后调用方法不同:

[NSURLConnection sendAsynchronousRequest:request
                                   queue:[NSOperationQueue mainQueue]
                       completionHandler:^(NSURLResponse *response, NSData *responseData, NSError *error) {
                           [self processTwitterSearchResponse:response data:responseData error:error];
                       }
 ];
直接调用该方法:

[NSURLConnection sendAsynchronousRequest:request
                                   queue:[NSOperationQueue mainQueue]
                       completionHandler:(processTwitterSearchResponse:response data:responseData error:error)
 ];

或者一些类似的。

不。如果该方法将一个块作为其处理程序,则需要给它一个块。为什么?

有一些方法采用函数指针而不是块,比如NSArray的
-sortedArrayUsingFunction:context:
(与基于块的
-sortedarrayusingcomarator:
)不同,但您肯定不能在需要块的地方交换方法签名。

总之,不是

如果该方法需要一个块,则必须给出它


理解这一点的一种方法是:块从定义它们的位置(词法范围)捕获状态(变量值),允许将该状态传递给另一个线程以延迟执行。这就是为什么它们不能与函数指针互换;块中包含了更多的信息。

这是一个明智的问题,只需在已经给出的答案上添加一点

如果您查看直接接受另一个方法作为参数的方法,您会注意到它还接受一个附加参数,即调用该方法的对象。看看你的块例子,你会看到它引用了
self
,所以你的块提供了相同的一对值——一个方法和一个对象


Objective-C完全没有理由不能有一个包含对象和方法的构造,比如说
@block(object,method)
,或者更简单地说就是
object.method
,并返回一个块,但它没有。如果您熟悉C#,您会知道它确实有这样一个构造来生成委托,这是它的块版本。

非常感谢您提供了带有示例的详细答案!创建调用该方法的块有多难?