iOS: el método devuelve un bloque y el bloque se almacena en la matriz, ¿cuándo debo copyrlo?

Tengo un método que devuelve un bloque y otro método que utiliza el método:

- (MyBlock)blockForParameter:(id)param { MyBlock theBlock = ^(){NSLog(@"Param: %@", param);}; return theBlock; } - (void)methodUser { MyBlock theBlock = [self blockForParameter:something]; [self.allBlocks addObject:theBlock]; } 

La pregunta es, ¿cuándo debo copyr el bloque? ¿Debo copyr el bloque cuando lo devuelvo en blockForParameter , o debería copyrlo cuando lo agrego a la matriz?

Gracias

Los bloques deben copyrse si "sobreviven al ámbito en el que fueron creados", por lo que debe copyr el bloque en su método blockForParameter , antes de devolverlo.

Editar: con ARC, esto ya no es cierto. Ver, por ejemplo, Objective-C: bloques en ARC y las references en el mismo:

  • Devolver un bloque desde una function no requiere copyr el bloque.
  • Agregar un bloque a una colección requiere una copy en bloque.

Mira cada método por separado.

En -blockForParameter: el literal del bloque se devuelve del método. El bloque debe copyrse para sobrevivir al scope del literal. En MRC, deberías devolver el bloque copydo y autoreleased. En ARC, no necesitas hacer nada.

En -methodUser , el bloque no está definido en ese método; se recibe de una llamada de método. Por lo tanto, ya debe haber sido copydo (es decir, no es un bloque de stack). Por lo tanto, no necesita hacer nada con él cuando addObject: a ello.