iOS中的内联块

use*_*014 2 ios objective-c-blocks

我对iOS块完全陌生.我在一本关于ios内联块的书中读过.什么是内联块?我们可以用任何物体吗?普通和内联块有什么区别?

这就是我在书中看到的

使用内联块而不是回调函数

NSArray* arr2 = [arr sortedArrayUsingComparator: ^(id obj1, id obj2) {
    NSString* s1 = obj1;
    NSString* s2 = obj2;
    NSString* string1end = [s1 substringFromIndex:[s1 length] - 1];
    NSString* string2end = [s2 substringFromIndex:[s2 length] - 1];
    return [string1end compare:string2end];
}];
Run Code Online (Sandbox Code Playgroud)

如上例所示,内联定义的块不可重用; 如果我们有两次调用sorted-ArrayUsingComparator:使用相同的回调,我们必须完全写回两次回调.为了避免这种重复,或者为了清楚起见,可以将块分配给变量,然后将该变量作为参数传递给期望块的方法,如下例所示.将块分配给变量

NSComparisonResult (^sortByLastCharacter)(id, id) = ^(id obj1, id obj2) {
    NSString* s1 = obj1;
    NSString* s2 = obj2;
    NSString* string1end = [s1 substringFromIndex:[s1 length] - 1];
    NSString* string2end = [s2 substringFromIndex:[s2 length] - 1];
    return [string1end compare:string2end];
};
Run Code Online (Sandbox Code Playgroud)

NSArray*arr2 = [arr sortedArrayUsingComparator:sortByLastCharacter]; NSArray*arr4 = [arr3 sortedArrayUsingComparator:sortByLastCharacter]; 块的最显着特征可能是:定义块的范围内的变量在该时刻保持其在块内的值,即使该块可能在稍后的某个时刻执行.(从技术上讲,我们说块是一个闭包,块外部的变量值可以被块捕获.)块的这个方面使它们可用于指定稍后要执行的功能,甚至是其他一些功能.线.

Cou*_*per 7

这可能意味着,您可以直接放置块的定义来代替块参数:

给定一个带有Block作为参数的API:

- (void) doSomethingWithBlock:(void(^)(id param))block;
Run Code Online (Sandbox Code Playgroud)

注意块的类型是

typedef void(^block_type)(id param);
Run Code Online (Sandbox Code Playgroud)

也就是说,它具有类型的参数参数id并返回void.

现在,您可以定义块内联:

...
[self doSomethingWithBlock:^(id param) {
    // implementation
});
Run Code Online (Sandbox Code Playgroud)

而不是定义一个"脱节"块:

block_type myBlock = ^(id param) {
    // implementation
};
Run Code Online (Sandbox Code Playgroud)

并通过以下方式调用:

[self doSomethingWithBlock:myBlock];
Run Code Online (Sandbox Code Playgroud)