2012-05-03 10 views
6

que tienen un bloque en el que yo uso self así que declarar una referencia débil mental:bloques anidados y las referencias a la libre

__weak MyClass *weakSelf = self; 

Ahora mis preguntas:

  1. me sale un error en el que define weakSelf y no entiendo lo que esto debería significar .:

    atributo débil no se puede especificar en una variable automática

  2. Dentro de mi bloque que pase weakSelf a otro bloque y no estoy seguro de si ahora tengo que hacer lo mismo otra vez, así:

    __weak MyClass *weakWeakSelf = weakSelf; 
    

    y luego pasar weakWeakSelf a ese bloque?

+0

¿Ha encontrado la respuesta para esto todavía? Me refiero a la parte weakweakself. –

Respuesta

8

Esto es más probable que se producen como usted está apuntando hacia abajo para iOS 4. se debe cambiar para ser

__unsafe_unretained MyClass *weakWeakSelf = weakSelf; 
+0

El objetivo es 5.0 ... – Besi

+0

Es curioso si cambio mi 'Destino de despliegue' a <5.0. Recibo el error que tenía. pero por encima de eso está bien. ¿Esto resolvió el problema? –

+0

¿Debo declarar weakWeakSelf también? – Besi

3

Con ARC

__weak __typeof__(self) wself = self; 

wihtout ARC

__unsafe_unretained __typeof__(self) wself = self; 
1

Con libextobjc será legible y fácil:

- (void)doStuff 
{ 
    @weakify(self); 
    // __weak __typeof__(self) self_weak_ = self; 

    [self doSomeAsyncStuff:^{ 

     @strongify(self); 
     // __strong __typeof__(self) self = self_weak_; 

     // now you don't run the risk of self being deallocated 
     // whilst doing stuff inside this block 
     // But there's a chance that self was already deallocated, so 
     // you could want to check if self == nil 

     [self doSomeAwesomeStuff]; 

     [self doSomeOtherAsyncStuff:^{ 

      @strongify(self); 
      // __strong __typeof__(self) self = self_weak_; 

      // now you don't run the risk of self being deallocated 
      // whilst doing stuff inside this block 
      // Again, there's a chance that self was already deallocated, so 
      // you could want to check if self == nil 

      [self doSomeAwesomeStuff]; 

     }]; 
    }]; 
} 
Cuestiones relacionadas