4

以下のコードでは、保持サイクルの問題を正しく理解していますか?保持サイクルはありますか?

- (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;
}
4

1 に答える 1

12

保持サイクルがありますが、それは一時的なものです。これは保持サイクルです。

  • self保持しますimportContext
  • importContextブロックを保持します
  • ブロックは保持しますself

ブロックの実行が終了するとすぐに、ブロックをimportContext解放します。その時点で、ブロックの保持カウントはゼロになり、割り当てが解除されます。割り当てが解除されると、が解放されますself

一般に、ブロックを含む保持サイクルは、ブロックが無期限に保持される場合にのみ問題になります。たとえば、プロパティ、インスタンス変数、またはコンテナにブロックを格納しているためです。近い将来、ブロックを1回実行する関数にブロックを渡すだけの場合は、通常、保持サイクルについて心配する必要はありません。

于 2013-03-23T05:18:28.940 に答える