Я понимаю, что вы должны скопировать блоки, чтобы они могли встать после того, как кадр стека завершится. Но, как это применимо к стек, выделенные блоки, используемые в вложенном блоке, как показано в следующем примере кода:Должен ли я скопировать блок здесь?
- doSomethingFunkyThenCall:(void(^)(int someValue))callback
{
[[NSOperationQueue currentQueue] addOperationWithBlock:^{
// ... do some work here, potentially nesting into further blocks ...
callback(result);
}];
}
Очевидно, что кадр doSomethingFunkyThenCall:
стек будет заканчиваться до обратного вызова выполняется, так что придется быть скопировано. Но произойдет ли это автоматически при вызове addOperationWithBlock:
или мне нужно сделать это вручную?
Nope; нет необходимости копировать блок в этом случае. Когда будет скопирован блок, заключенный с 'addOperationWithBlock:' (который будет выполняться 'NSOperationQueue'), он скопирует инкапсулированный блок. – bbum
Спасибо. Ты прав. http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Blocks/Articles/bxVariables.html#//apple_ref/doc/uid/TP40007502-CH6-SW1 – joerick
Благодарим вас за участие! Я еще не видел этот абзац из этой ссылки: «Когда вы копируете блок, при необходимости копируются любые ссылки на другие блоки из этого блока - все дерево может быть скопировано (сверху). Если у вас есть блок-переменные и вы ссылаетесь на блок изнутри блока, этот блок будет скопирован ». –