我刚刚开始使用积木和Grand Central Dispatch.我被告知(并在Apple文档中阅读)任何块中引用的对象都会被保留.
例如:
^{  
    self.layer.transform = CATransform3DScale(CATransform3DMakeTranslation(0, 0, 0), 1, 1, 1);
    self.layer.opacity = 1;
}
Run Code Online (Sandbox Code Playgroud)
"自我"得到保留,因此泄漏.为了避免这种情况,我需要将self分配给:
__block Object *blockSelf = self;
Run Code Online (Sandbox Code Playgroud)
然后使用blockSelf而不是self在我的块中.
我的问题是:当你的块有更多的代码并引用几个对象时会发生什么?我需要将它们全部分配给__block对象吗?例如:
^{  
    [self doSomething];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"prevName == %@", artistName];
    [request setEntity:entity];
    [request setPredicate:predicate];
    Object *newObject = [[Object alloc] init];
    [someArray addObject];
    [newObject release];
}
Run Code Online (Sandbox Code Playgroud) 这里有一个类似的问题,并不能完全解释我想要什么:Objective C Blocks as Async-callbacks&BAD ACCESS
我有一个视图控制器,它使用异步回调调用服务。回调使用一个块来完成,该块引用视图控制器上的变量以填充它们。
看起来像这样:
- (void) loadData {
    __block MyViewController *me = self;
    [self.service executeWithCompletion:^(NSArray *result, NSError *error) {
        if (!error) {
            me.data = result;  
        }
    }];
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我取消分配视图控制器,则回调将严重访问“ me”。
使“ me”为NULL的最简单方法是什么?如果我将其作为iVar,那么它会带回循环引用...我认为呢?
我想我缺少明显的东西。
谢谢