我有一个方法:
- (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
由内部块使用,并传递给处理程序块。
答案 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循环没有什么不同。