2016-10-29 2 views
0

Dans une application non-ARC, j'ai une sous-classe NSOperation qui est en file d'attente par un délégué et ressemble à:dispatch_async et retenir (non-ARC)

// note that the delegate and element properties are retained 

-(id)initWithDelegate:(id<SomeDelegate>)inDelegate element:(SomeElement *)inElement 
{ 
    if (self = [super init]) 
    { 
     [self setDelegate:inDelegate]; 
     [self setElement:inElement]; 
    } 
} 

-(void)dealloc 
{ 
    [_delegate release]; 
    [_element release]; 
    [super dealloc]; 
} 

-(void)main 
{ 
    // do stuff 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [[self delegate] doSomething:[self element]]; 
    }); 
} 

Depuis [[délégué auto] doSomething: [auto element]] sera appelé après que mon objet NSOperation ait été libéré, dois-je m'assurer de conserver "element" dans le délégué avant d'ajouter cette opération à la file d'attente? L'objet élément est conservé ailleurs dans l'application mais il pourrait potentiellement être libéré là. Je dois m'assurer que lorsque mon délégué le reçoit de NSOperation, c'est toujours un objet valide.

Je me demandais simplement si le fait de l'appeler dans dispatch_async conserverait les arguments qui lui sont passés. Je pourrais bien sûr utiliser NSInvocation et performSelectorOnMainThread qui le retiendraient.

+0

Désolé - self est retourné depuis l'init. Je n'ai pas ajouté cela à ma question mais c'est là dans le code original. – Trygve

+0

Josh est correct (voir ci-dessous). Voir [Blocs Objective-C] (https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Blocks/Articles/bxVariables.html#//apple_ref/doc/uid/TP40007502-CH6-SW4) dans _Blocks Sujets de programmation: Blocs et variables._ – Rob

Répondre

5

La file d'attente conserve le bloc lorsqu'il est en file d'attente et le bloc conserve les objets qu'il capture, tels que self. Depuis self a ici une forte référence à son element, le element sera valide au moins jusqu'à ce que le bloc fonctionne.

Notez qu'il est inhabituel pour un objet d'avoir une référence forte à son délégué: assurez-vous que vous n'avez pas de cycle de rétention ininterrompu à cet endroit.