【发布时间】:2013-03-13 01:46:52
【问题描述】:
在下面的代码中,我是否正确理解了保留周期问题,是否会有保留周期?
- (NSError *)importRoute:(NSDictionary *)route {
[self.importContext performBlockAndWait:^{
[NSEntityDescription insertNewObjectForEntityForName:@"Entity" inManagedObjectContext:self.importContext];
//do I get a retain cycle here?
}];
...
}
- (NSManagedObjectContext *)importContext {
if (!_importContext) {
id appDelegate = [[UIApplication sharedApplication] delegate];
_importContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
_importContext.parentContext = [appDelegate managedObjectContext];
}
return _importContext;
}
【问题讨论】:
-
推测,
self拥有/保持对_importContext的强引用,_importContext可能复制了传入其中的块并对其具有强引用,并且该块可能保留了self,所以它肯定有可能存在一个保留周期。我觉得我无法准确掌握保留周期何时发生并且是一个问题,但我确实知道(1)clang 有时会警告我它们,并且(2)很容易让一个弱者引用 self 并在块内使用它,没有缺点(至少,不是在你的用例中,也不是我见过的)。 -
你是对的,self 拥有对 _importContext 的强引用。编译器不会在此处警告保留循环,并且仪器也不显示循环。我只是想澄清一下,在这种情况下,实际上可能没有循环,尽管 self 被捕获在块中......
标签: objective-c memory-management automatic-ref-counting retain-cycle