2013-04-24 2 views
2

У меня есть подкласс NSOperation, и я хочу сделать что-то вроде этого:Нужно ли мне блокировать блок, который я передаю в setCompletionBlock NSOperation :?

@interface MyOperation : NSOperation... 

MyOperation *myOperation = [[MyOperation alloc] init]; 

[myOperation setCompletionBlock = [^{ 
    [myOperation doSomething]; // Do something with myOperation and other classes captured from original environment 

    [myOperation setCompletionBlock:nil]; // Manually setting to nil avoid retain cycles; 
} copy]; <- is this "copy" needed here? 

И вот мой вопрос для этого кода является вопрос название:

мне нужно скопировать Do (Block_copy()) блок, который я передаю setCompletionBlock: или NSOperation сделает это для меня?

+1

Nope. NSOperation должен блокировать его копирование от вас из-за того, как работают атомарные операции. – CodaFi

ответ

4

От -[NSOperation setCompletionBlock:] reference:

Блок который будет выполняться при завершении операции. Этот метод создает копию указанного блока. Сам блок не должен принимать никаких параметров и не иметь возвращаемого значения.

Нет, вам не нужно копировать блок, поскольку NSOperation уже делает это за вас.

+0

Извините за то, что вы не указали на это, так или иначе я упускал из виду именно эту строку. Спасибо за быструю реакцию. –

2

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

Только когда вы передаете блок API, который принимает аргумент типа универсального объекта, вам когда-либо нужно беспокоиться о том, следует ли его копировать.

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