[英]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.