-2

この場合、メモリサイクルが発生する理由を知りたいです。

@property (nonatomic, strong) NSArray *myBlocks;

// and the method

[self.myBlocks addObject: ^(){
    [self doSomething];
}]; 

ブロック内で自己が参照されているため、ブロックには自己への強力なポインターがあります。そして、myBlocks を強く指します。しかし、なぜ myBlocks はブロックへの強力なポインターを持っているのでしょうか?

4

2 に答える 2

0

self であるクラスには、myBolcks への強い参照があります。

@property (nonatomic, strong) NSArray *myBlocks;

そして、これはアップルのドキュメントから取られています:

Blocks maintain strong references to any captured objects, including self...

あなたのシナリオでは、selfにはブロックへの強力なポインタがあり、selfをキャプチャすることでブロックすることもできます。また、サイクルを保持する強力なポインタdo selfもあり、メモリリークが発生します。

このサイクルを断ち切るには、ブロックに渡す前に自分自身への弱いポインターを使用します。

于 2014-08-13T11:30:24.740 に答える
0

しかし、なぜ myBlocks はブロックへの強力なポインターを持っているのでしょうか?

NSArray は、その要素への強力な参照を保持します。

一般に、array... メッセージの 1 つを NSArray クラスまたは NSMutableArray クラスのいずれかに送信して、配列をインスタンス化します。array... メッセージは、引数として渡した要素を含む配列を返します。オブジェクトを NSMutableArray オブジェクトに追加しても、オブジェクトはコピーされません (initWithArray:copyItems: の引数として YES を渡さない限り)。代わりに、オブジェクトへの強い参照が配列に追加されます。

詳細はこちら

于 2014-08-13T11:28:12.767 に答える