5

ブロック内にいくつかの操作があります。UIImageこの操作は、次のようにのみ更新します。

^(UIImage *image) {
            self.myImage = image;
        }];

私の画像は、インターネットにアクセスして計算されNSURLConnectionます。インターネットから画像を受け取ると、 内にあるそのブロックを呼び出しますNSMutableArray。ここまでは順調ですね。私の問題は、複数の呼び出しを行う代わりに、同じ URL を持つ複数の画像がある場合NSMutableArray、接続を処理するクラス内に新しいブロックを追加するだけです。このようにして、1 つの呼び出しを行い、URL を共有する複数の画像を更新します。すべてが正常に機能します。問題は、ブロックがリークしていることです。次のようなブロックをに追加しますNSMutableArray

 if( (self = [super init]) ) 
    {
        self.connectionURL=url;
        self.arrayOfBlocks=[NSMutableArray array];
        [arrayOfBlocks addObject:completion];
    }
    return self;

これは、接続クラスが初期化されるときです。これは、新しいブロックをに追加する必要があるときですNSMutableArray(私はそれを追加するだけで、それだけです):

[arrayOfBlocks addObject:completion];

これは、最終的にコールバックを受け取り、ブロックの実行を開始するときです。

 for (MyBlock blockToExecute in arrayOfBlocks)
    {
        blockToExecute([UIImage imageWithData:data]);
    }

問題は、これがどういうわけか漏れていることです。私は ARC 環境にいるため、リリースまたは自動リリースを使用して対抗することができません。では、解決策は何でしょうか?


ここに画像の説明を入力

4

2 に答える 2

6

これは、Apple のフレームワークでよく知られているリークです。ブロックの使用が原因ではありません。

これについての以前の質問バグレポートがあります。

于 2012-05-09T16:46:34.653 に答える
0

ブロックは「自己」を保持しており、「自己」がブロックを保持していると推測しています (「arrayOfBlocks」プロパティを介して)。そのプロパティが保持されている場合は、循環参照とリークがあります。ARC が循環参照を処理するとは思わないので、ブロック配列を使い終わったら空にする (またはプロパティを nil に設定する) べきであり、他にブロックを参照するものがないことを確認してください。

于 2012-05-09T11:22:45.270 に答える