2013-03-01 3 views
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]; 
} 
+0

На самом деле есть утечка? –

+0

@ 0x7fffffff Да, есть. Это незначительно, но утечка тем не менее. – MdaG

+0

@ 0x7fffffff Нет, утечки нет. Я думаю, что весь вопрос здесь фиктивный. ARC полностью заботится об этой «утечке». –

ответ

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

Или вы будете переписывать переменную каждый раз, когда вы вызываете метод.

+2

Это не отвечает на вопрос, насколько я могу судить. –

+0

Протекает, потому что завершенный блок повторно назначен. Но он только течет, если блок, переданный как аргумент, был скопирован раньше (и как я могу это знать). –

+0

нет утечки, если он переназначен, ARC автоматически справляется с этим. Попробуйте запустить мой пример (в моем ответе) с помощью инструментов, вы обнаружите, что утечки абсолютно нет. –

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 не была включена, то определенно - это утечка в этом коде.

+0

Это не подделка, но, может быть, проблема кроется в тех частях кода, которые я здесь не показывал,/* Do stuff */parts that?/* Do stuff */code использует стороннюю библиотеку ... – MdaG

+0

@MdaG, во всяком случае, проблема заключается не в коде, который вы отправили. –

+0

В этом случае мое «исправление» на самом деле ничего не решает. :( – MdaG

Смежные вопросы