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

时间:2012-11-04 23:32:43

标签: objective-c ios objective-c-blocks

我有一个方法:

- (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由内部块使用,并传递给处理程序块。

4 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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

我是否需要为参数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];
    }];
}];

答案 2 :(得分:0)

  

我做对了吗?

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

  

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

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

  

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

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

  

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

不,但这是一个不错的主意。块保持其范围。

答案 3 :(得分:0)

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

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