0

私は最近、以下がマークされたコードに「割り当て」られました#warning memory leak

- (void)aMethodWithCallback:(BlockType)completedBlock {
        /* Do stuff */
        completedBlock = ^(Class1 *obj, NSError *error) {
            /* Do stuff */
#warning memory leak
            if (completedBlock) {
                completedBlock(obj, error);
            }
         };

         [self callAnotherMethodWithCallback::completedBlock];
    }

どうすればいいのかわかりませんが、入力ブロックとして名前のブロックを作成するのは奇妙に見えますが、うまくいくようです。上記のコードが危険なのはなぜですか?

edit ARC が有効になっています。

コードを次のように変更したところ、もうリークしていないようです。

- (void)aMethodWithCallback:(BlockType)completedBlock {
    /* Do stuff */
    BlockType completedBlock2 = ^(Class1 *obj, NSError *error) {
         /* Do stuff */
         if (completedBlock) {
            completedBlock(obj, error);
         }
    };

    [self callAnotherMethodWithCallback::completedBlock2];
}
4

2 に答える 2

1
 - (void)aMethodWithCallback:(BlockType)completedBlock {
     id obj = nil;
     NSError error = nil;
/* make your stuff with obj and error*/

     if (completedBlock)
        completedBlock(obj, error);

     [self callAnotherMethodWithCallback::completedBlock];
 }

または、メソッドを呼び出すたびに変数を書き換えます。

于 2013-03-01T13:12:40.767 に答える
0

私が知る限り、あなたが提供した小さなコードスニペットにリークはありません。メモリリークが発生した場合、それは提供したコードのスニペットには含まれていません。次のプログラムは、ARCでコンパイルすると、問題なく計測器で実行されるためです。

void func2(void (^block)(void));

void func1(void (^block)(void))
{
    block = ^() {
        if (block)
            block();
    };

    func2(block);
}

void func2(void (^block)(void)) {
    if (block)
        block();
}

int main()
{
    func1(^{
        NSLog(@"Callback");
    });
}

何かが足りないか、「割り当てられた」コードが偽物です。

注:参照されているシナリオでARCが有効になっていることを確認します。ARCが有効になっていない場合は、間違いなくそのコードにリークがあります。

于 2013-03-01T13:44:27.197 に答える