Pregunta

Estoy tratando de entender bloques. Llego cómo usarlos normalmente, cuando se pasa directamente a un método. Ahora estoy interesado en tomar un bloque, almacenándola (por ejemplo) en una variable de instancia y llamar más tarde.

Los bloques guía de programación hacen que suene como que puedo hacer esto, mediante el uso de Block_copy / retener a copiar la manzana, pero cuando intento ejecutarlo me estrelle mi programa.

- (void) setupStoredBlock
{
    int salt = 42;
    m_storedBlock = ^(int incoming){ return 2 + incoming + salt; };
    [m_storedBlock retain];
}

Trato de llamar más tarde:

- (void) runStoredBlock
{
    int outputValue = m_storedBlock(5);
    NSLog(@"When we ran our stored blockwe got back: %d", outputValue);
    [m_storedBlock release];
}

Cualquier persona tiene cualquier idea? (O, ¿hay algo que yo no recibo con bloques?)

Muchas gracias!

¿Fue útil?

Solución

Usted querrá hacer esto en su lugar:

- (void) setupStoredBlock
{
    int salt = 42;
    m_storedBlock = Block_copy(^(int incoming){ return 2 + incoming + salt; });
}

Otros consejos

Copiar un bloque cuando se desea que permanezca alrededor. Autorelease o soltarla cuando termine con ella. Retenerlo si necesita un largo camino para deletrear /* NOP */.

@interface Foo : FooSuper {}
@property(copy) int (^storedBlock)(int);
@end

@implementation Foo
@synthesize storedBlock = mStoredBlock;

- (void)setupStoredBlock {
    self.storedBlock = ^{/*...*/};
    // or: mStoredBlock = [^{/*...*/} copy];
    // but this simple implementation violates the atomicity contract
}

- (void)runStoredBlock {
    int result = self.storedBlock(5);
    NSLog(@"%s: result = %d", __func__, result);
}
@end

• Al igual que todas las variables locales, existe un bloque no estático en la pila y se metió de la pila, como cualquier otra variable local que no ha sido declarada estática.

• Block_copy () copia el bloque de la pila en el montón, donde existen todas las instancias malloc. Y al igual que todos los nuevos / copiar métodos, Block_copy () devuelve un objeto asignado montón con una retener contar del 1. Un bloque es un objeto objectivec pero doesnot se ajusta como un objeto normal. Por lo tanto, no debería haber ninguna diferencia entre Block_Release () y el método de liberación objetivo.

• Este ejemplo utiliza el método de copia de una instancia de bloque. Debido a asignar el resultado de una Block_copy () para un ID requiere una conversión de tipo que yo donot quiere conseguir equivocado. El método de copia permite que la variable de bloque que se debe asignar directamente a un id.

 - (void) setupStoredBlock
{
    int zStackLocalVariable = 42;
    iHeapAllocatedVariable = [^int(int aMore){ return zStackLocalVariable + aMore; } copy];
}

• Para declarar un objeto estático es requerir que sea asignado físicamente con el propio código. Un bloque que se declara estático es compilador prohibido el acceso a las variables fuera de su propio ámbito. Debido a los requisitos de una declaración bloque estático, supongo que el bloque en la pila es de alguna manera diferente a partir del bloque que está en el montón.

• Un bloque es un objeto cuya clase c objetivo cuyo nombre de clase y otra información asociada todavía no he intentado recuperar, pero, al igual Protocolo, objetos y otras clases objectivec ocultos, no se ajusta a NSObject. Como todos los objetos objectivec, sin embargo, debe ajustarse para retener / liberación. ARC extiende retener / equivalencias de liberación en la Fundación Núcleo objetos así, y probablemente, si no es ahora, finalmente, en malloc / asignaciones gratuitas.

• espero la verdadera motivación para una exploración exhaustiva de mikeash.com , ya que apple le gusta mantener a todos en algún plano hiper-theoritical de poca importancia física, a pesar de todo lo que es significativo es física.

ARC y bloques también discuten aquí

Hubo una muy buena presentación sobre ese tema en la WWDC reciente (2010). Se describe cómo se implementaron los bloques y por qué es necesario utilizar Block_copy. Puede descargar una película de la presentación en: http://developer.apple.com/itunes/?destination=adc .apple.com.4092414566 La película se llama: "Opciones avanzadas de Objective-C y la recolección de basura"

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top