繁体   English   中英

ObjectiveC:将方法参数传递给块内的块?

[英]ObjectiveC: Passing method parameter to a block inside a block?

我有一个方法:

- (void)myMethod:(NSError *)error
{
    [[self.data allKeys] enumerateUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){
        __block NSString *channelName = obj;
        NSArray *subArray = [self.data objectForKey:obj];
        [subArray enumerateUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){
            Wrapper *wrapper = obj;
            [wrapper handleError:error forChannel:channelName];
        }];
    }];
}

1)我是否需要为参数obj,idx和内部块的stop使用不同的名称?

2)我是否需要将channelName定义为__block?

3)我是否需要在所有块之外定义弱自我并在块中使用它?

编辑:

channelName由内部块使用,并传递给处理程序块。

除非内部块需要访问外部块的参数,否则不需要为内部块使用不同的参数名称。 在内部块中,重复的名称只是隐藏外部块的参数。 如果需要,不同的名称将消除隐藏。

如果要在块中修改变量,则只需要使用__block标记变量。 对于对变量的只读访问, __block

我对这个问题的self部分并不乐观。 通常,当您使用可能导致保留周期的变量时,您会在Xcode中看到警告。 除非你看到警告,否则你应该没问题。

我做对了吗?
它能做你需要做的吗?

我是否需要为参数obj,idx和内部块的stop使用不同的名称?
你试过吗? 它有用吗?

我是否需要或不需要将channelName定义为__block?
你真的在任何地方使用它吗? 如果不是为什么要宣布这一切?

我是否需要在所有块之外定义弱自我并在块中使用它?
不,这里没有保留周期


您可以考虑在字典上使用块枚举来稍微清理它

[self.data enumerateKeysAndObjectsUsingBlock:^(id key, NSArray *subArray, BOOL *stop) {
    [subArray enumerateUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){
        Wrapper *wrapper = obj;
        [wrapper handleError:error];
    }];
}];

我做对了吗?

不,您在两个参数列表前面都缺少块文字声明符(^)。 是。

我是否需要为参数obj,idx和内部块的stop使用不同的名称?

不。这些参数是块的参数,并且可以在其范围内访问。

我是否需要或不需要将channelName定义为__block?

不是。它在块的范围内声明,并且仅在该块内修改,因此它不需要__block说明符。 __block在块的上下文中声明块的范围之外的变量是可变的。

我是否需要在所有块之外定义弱自我并在块中使用它?

不,但这是个好主意。 块保留其范围。

您的块同步运行并且不会复制到堆中,因此您无需执行任何额外操作。 没有特殊的内存管理需要考虑(即,不需要弱引用)并且您不需要__block限定符(除非内部块需要修改外部变量)。

换句话说,你所拥有的只是一个普通的旧嵌套for循环。 内存管理与实际的for循环没有什么不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM