gpt4 book ai didi

ios - iOS 中的内联 block

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:16:48 25 4
gpt4 key购买 nike

我对 iOS block 完全陌生。我读过一本关于 ios 中的内联 block 的书。内联 block 到底是什么?我们可以将它用于任何对象吗?普通 block 和内联 block 有什么区别?

这是我在书上看到的

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

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];
}];

如上例所示,内联定义的 block 是不可重用的;如果我们两次调用 sortedArrayUsingComparator: 使用同一个回调,我们就必须完整地写出回调两次。为了避免这种重复,或者只是为了清楚起见,可以将一个 block 分配给一个变量,然后将其作为参数传递给需要一个 block 的方法,如下例所示。 将 block 分配给变量

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 sortedArrayUsingComparator: sortByLastCharacter];NSArray* arr4 = [arr3 sortedArrayUsingComparator: sortByLastCharacter];也许 block 最显着的特征是:在定义 block 时范围内的变量在那一刻将它们的值保留在 block 内,即使 block 可能在稍后的某个时刻执行。 (从技术上讲,我们说 block 是闭包, block 外的变量值可能会被 block 捕获。) block 的这一方面使它们可用于指定稍后执行的功能,甚至在其他某个时间执行线程。

最佳答案

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

给定一个以 block 作为参数的 API:

- (void) doSomethingWithBlock:(void(^)(id param))block;

注意 block 的类型是

typedef void(^block_type)(id param);

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

现在,您可以定义一个内联 block :

...
[self doSomethingWithBlock:^(id param) {
// implementation
});

相对于定义一个“越界”的 block :

block_type myBlock = ^(id param) {
// implementation
};

并通过以下方式调用它:

[self doSomethingWithBlock:myBlock];

关于ios - iOS 中的内联 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21677055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com