1

「私は ARC の専門家ではないことを認め、サイクルを保持していますが、いくつかの研究といくつかの優れた記事 (このようなもの) を通じて、基本を理解したと信じています.

しかし、私は現在困惑しています。次のように定義されたプロパティがあります。

@property (nonatomic,retain) Foo *foo;

私の中でinit、私は次のことを行います。

if(self = [super init]) {

    _foo = [[Foo alloc] initWithDelegate:self];

    // async the rest
    __weak typeof(self) weakSelf = self;
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
                                             (unsigned long)NULL), ^(void) {

        __strong typeof(weakSelf) strongSelf = weakSelf;

        if (strongSelf.foo != nil) {
                        [strongSelf.foo runTests];
        }
    });
}
return self;
}

そして、ここに私のdeallocがあります

- (void)dealloc {
     _foo = nil;
}

dispatch_ayncブロックがコメントアウトされている場合、deallocfoo が に設定された直後に Foo が呼び出されることがわかりnilます。ブロックがコメントインされているため、foodellocは呼び出されません。

リテインサイクルは正しいですか?方法はありますか?

4

1 に答える 1