0

我有一个方法:

- (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

4 回答 4

2

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

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

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

于 2012-11-04T23:38:39.830 回答
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];
    }];
}];
于 2012-11-04T23:39:11.360 回答
0

我在做正确的事吗?

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

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

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

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

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

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

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

于 2012-11-04T23:39:45.957 回答
0

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

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

于 2012-11-05T00:37:31.013 回答