iOS中的内联块

iOS中的内联块,ios,objective-c-blocks,Ios,Objective C Blocks,我对iOS模块完全陌生。我在一本书中读到了关于ios内联块的内容。内联块到底是什么?我们能把它用于任何物体吗?普通块和内联块之间有什么区别 这就是我在书中看到的 使用内联块而不是回调函数 NSArray* arr2 = [arr sortedArrayUsingComparator: ^(id obj1, id obj2) { NSString* s1 = obj1; NSString* s2 = obj2; NSString* string1end = [s1 subs

我对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];
}];
如上例所示,内联定义的块是不可重用的;如果我们有两个对sorted-arrayusingcomarator的调用:使用同一个回调,我们必须完整地写出回调两次。为了避免这种重复,或者为了清楚起见,可以将块指定给变量,然后将变量作为参数传递给需要块的方法,如下面的示例所示。 将块指定给变量

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];
};
NSArray*arr2=[arr sortedarrayingcomparator:sortByLastCharacter]; NSArray*arr4=[arr3 sortedarrayingcomparator:sortByLastCharacter];
也许块最显著的特征是:定义块时作用域中的变量在该时刻保持其值在块内,即使块可能在稍后的某个时刻执行。(从技术上讲,我们说块是一个闭包,块外的变量值可能会被块捕获。)块的这一方面使它们对于指定稍后执行的功能非常有用,甚至可以在其他线程中执行。

这可能意味着,您可以直接将块的定义替换为块参数:

给定一个以块为参数的API:

- (void) doSomethingWithBlock:(void(^)(id param))block;
请注意,块的类型为

typedef void(^block_type)(id param);
也就是说,它具有类型为
id
的参数param,并返回
void

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

...
[self doSomethingWithBlock:^(id param) {
    // implementation
});
与定义块“线外”相反:

并通过以下方式调用:

[self doSomethingWithBlock:myBlock];

书上说了什么?你不明白吗?这本书没有举例说明吗?
[self doSomethingWithBlock:myBlock];