ios store ^ block en dictionary o matriz?

¿Puedo almacenar ^ block en un dictionary o una matriz?

Necesito escuchar una notificación del server que necesito proporcionar un bloque para manejar la notificación, y en mi proyecto varios controlleres de vista todos quieren escuchar la notificación, así que hice un administrador de notifications genérico, que tiene su propio bloque para manejar el server notificación y tiene una variedad de delegates, por lo que en el bloque del administrador:

- (^)(NSString *message){ for (delegate in allDelegates) { delegate.handlerBlock(message); } } 

pero ¿puedo almacenar bloques en una colección?

Puede almacenar objects en la colección. Pero cuida el scope: cópialos cuando se mantendrán fuera del scope de una function. Este es su caso ya que los está almacenando en una matriz.

 [NSArray arrayWithObject: [[^{ NSLog(@"block 1"); } copy] autorelease], [[^{ NSLog(@"block 2"); } copy] autorelease], nil] 

En ARC, aún necesita decirle que absolutamente necesita copyr su bloque. Debería liberar el bloque cuando se libera la matriz.

  [NSArray arrayWithObject: [^{ NSLog(@"block 1"); } copy], [^{ NSLog(@"block 2"); } copy], nil] 

Los bloques son especiales porque deben copyrse en la mayoría de los casos cuando se deben conservar otros objects. Como debe haber leído ahora, esto se debe a que los bloques comienzan en la stack (un "bloque de stack"), y solo es válido en el ámbito local donde se definieron. Copiar un bloque de stack te da un bloque dynamic y eso tendrá una vida dinámica como los objects normales. Copiar un montón de almacenamiento simplemente lo conservará, por lo que siempre es correcto copyr un bloque cuando necesite mantenerlo por más time.

Ahora, las funciones que toman un argumento de bloque generalmente se hacen responsables de copyr bloques según sea necesario. Por lo tanto, no necesita hacer nada especial al pasar un bloque a estas funciones. Sin embargo, en este caso, pasas tu bloque a [NSArray arrayWithObject:] , que toma un argumento de object normal. Dado que no toma un argumento de bloque, no sabe copyr el argumento, por lo que simplemente lo retendrá. Entonces, cuando pasas un bloque a un método que toma un argumento de object normal, primero debes copyrlo.

Encontrarás cómo hacerlo si lees el muy buen artículo aquí . Y tenga en count especialmente el idioma "copyrlos del montón primero" mencionado allí.