iOS: block 和 ivars

标签 ios objective-c objective-c-blocks retain-cycle

在很多问题中,都会询问是否可以在 block 中使用self。答案是否定的,以避免循环引用。

现在,当我在我的 UIViewController 的 block 中使用“ivar”时应该没问题。但是当我使用时:

- (void)viewDidLoad
{
    [_customCell setChangedValueBlock:^{
        if(_object != nil){
            NSLog(@"This is a sample");
        }
    }];
}

dealloc从未调用过的方法:

-(void)dealloc{
    NSLog(@"Dealloc");
}

当我删除 if(_object != nil){ dealloc方法被调用。

我应该弱引用 _object在将其传递给 block 之前?

最佳答案

使用 ivar(属性,无论什么)与使用 self 完全相同 - 你已经隐式使用了 self。您需要执行weak-strong dance .

不过,通过属性传递会更好,因为它可以成为线程安全的,并且直接在已释放的弱引用上访问实例变量将导致您的设备爆炸。

关于iOS: block 和 ivars,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23860055/

相关文章:

ios - 如果我不放置断点,将获得 EXC_BAD_access

ios - UITextView的用户控制宽度

objective-c - 如何使用 Core Audio 的时钟 API?

ios - UISearchBar、textDidChange 事件、MultipleNSUrlConnection、在 tableView 上崩溃

ios - 在 NSArray 中存储带有参数的 block

ios - 在 iOS 上使用(我的应用程序)打开视频

ios - Windows 上的 iOS6 应用程序部署无法正常工作

ios - 将文档目录的路径传递给 xcode 运行脚本

ios - 更改 Firebase 的包 ID

objective-c - 多个 block 相互嵌套,使用强自体和弱自体来避免循环引用