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];
    }

我不确定如何处理它,创建一个名称为输入块的块看起来很奇怪,但它似乎有效。为什么上面的代码很危险?

编辑 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 回答