- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 block ivar 中得到了一些带有明显引用循环的代码。以下代码会导致引用循环并且永远不会调用 dealloc:
__block MyViewController *blockSelf = self;
loggedInCallback = ^(BOOL success, NSError *error){
if (success)
{
double delayInSeconds = 1.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void)
{
[blockSelf.delegate loginDidFinish];
});
}
};
但是,如果我创建另一个 __block
变量来保存对我的委托(delegate)的引用,以便捕获 block 的范围,引用循环就会消失:
__block id <MyViewControllerDelegate> blockDelegate = self.delegate;
loggedInCallback = ^(BOOL success, NSError *error){
if (success)
{
double delayInSeconds = 1.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void)
{
[blockDelegate loginDidFinish];
});
}
};
只是想了解这里发生了什么。
最佳答案
我假设您在这里使用 ARC。在 ARC 之前,您的第一个示例就可以正常工作。在 ARC 中,__block
的语义发生了变化。 __block
声明现在被强捕获,而不是弱捕获。在您的第一个示例中将 __block
替换为 __weak
,所有这些都应该按预期工作。
至于第二个示例的工作原理,您正在创建对委托(delegate)的强引用,但您的委托(delegate)没有对对象的引用。因此没有循环,每个人都很开心。
我建议阅读 Mike Ash 关于 ARC 引入的变化的文章,尤其是关于 block 捕获和 __weak
http://www.mikeash.com/pyblog/friday-qa-2011-09-30-automatic-reference-counting.html
关于objective-c - __block 在 ARC 中的 ivar block 中的自引用循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8915981/
我正在使用这个 findAllMessages() 函数来返回一个 NSString ,其中包含有关每条消息的信息。 一切顺利,直到我走出 block 并且 concatenatedMessage 字
将外部声明的变量引入 block 时... 使用__block指令通过引用捕获变量... Variables local to the enclosing lexical scope declared
现在我正在开发一个横幅,显示 iOS 中的功能它是一个单例,当用户登录时,它会在屏幕的上部显示横幅。 它基本上是一个带有类方法 showWithName 的共享 View ... @interface
我正在尝试搜索提醒列表以检查是否存在提醒。方法中有一个选项可以保存提醒是否存在的值。我正在使用一个 block ,在 block 内,当找到提醒时,新值被分配给 reminderExists 变量,就
我正在尝试将 block 内的结果分配给 block 变量。这是我的代码: __block UIImage *latestImage; ALAssetsLibrary *assetLibrary =
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我应该声明为 (#1) 类名 * __ block 变量名 或 (#2) __block 类名 * 变量名 ? 我看到很多代码使用格式 #2,包括 Apple 的 Blocks Programming
我使用 AFNetworking 库已经有一段时间了,我刚刚遇到了一个问题。我使用了以下代码,它使用 GET 函数从远程 PHP 文件接收数据。 AFHTTPSessionManager *manag
在ARC中,下面这行代码有意义吗?请确认。 __block __weak MyViewController_iPad *blockSelf = self; 这不会抛出任何错误。不知道为什么。 考虑以下
我很困惑为什么我的全局变量在通过一个 block 后不能再次访问它。这是我的代码: __block NSString *latitude; __block NSString *longitude; C
这个问题在这里已经有了答案: Completion handlers and return values (1 个回答) 关闭 9 年前。 我有以下代码: - (Transporter *) get
我必须修复一些使用 LLVM(在 iOS 上)构建得很好的现有代码,以便它也可以使用 llvm-gcc-4.2 构建。除了在几个地方发现的这种模式外,我几乎完成了所有工作: @property (no
我在编译 Objective-C 类时遇到了以下错误: VideoView.h:7: error: __block attribute can be specified on variables on
我有以下代码片段: -(void) doSomething { __block NSMutableArray *objArray = [[NSMutableArray alloc] initW
我可以使用 __block 说明符在堆栈上指定一个变量,然后我可以在一个 block 中修改它。我只是想知道,幕后发生了什么? (如果该 block 在未来的某个时间执行,则堆栈可能会被清除) 最佳答
我想知道如何在方法的上下文中访问 __block 限定的 var 线程安全。 例子: __block NSMutableDictionary *dictionary = [NSMutableDicti
我对 __block 变量的语法有疑问。我知道您可以在范围内的变量上使用 __block ,因此它在 block 内不是只读的。然而在apple docs中的一个位置,我看到了一个替代方案: "Var
Objective-C 中的 __block 关键字究竟是什么意思?我知道它允许您修改 block 内的变量,但我想知道... 它究竟告诉编译器什么? 它还有其他作用吗? 如果仅此而已,那么为什么首先
我想创建以下类方法: +(void) getValue4Key:(NSString*)p_key andSet:(id)p_variable { NSString *baseURLStr
在阅读 NotificationCenter 文档时,我发现了下面的示例代码。我想澄清的是 __block 在这里是什么意思?我知道何时使用 __block 变量可以在块中更改,但 token 不会更
我是一名优秀的程序员,十分优秀!