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.
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
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