创建一个块并将其命名为输入块?

时间:2013-03-01 12:55:17

标签: ios objective-c automatic-ref-counting

我最近被“分配”到一段代码,其中以下标有#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];
}

2 个答案:

答案 0 :(得分: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];
 }

或者每次调用方法时都会重写变量。

答案 1 :(得分: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,那么肯定 是该代码中的泄漏。