In einer nicht-ARC App habe ich eine NSOperation Unterklasse, die von einem Delegierten Warteschlange gestellt ist, und sieht aus wie:dispatch_async und halten (nicht-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]];
});
}
Da [[self Delegat] doSomething: [self element]] wird aufgerufen, nachdem mein NSOperation-Objekt wahrscheinlich freigegeben wurde. Muss ich sicherstellen, dass "element" im Delegaten beibehalten wird, bevor dieser Vorgang zur Warteschlange hinzugefügt wird? Das Element-Objekt wird an anderer Stelle in der App beibehalten, könnte aber möglicherweise dort veröffentlicht werden. Ich muss sicherstellen, dass, wenn mein Delegat es von der NSOperation zurückerhält, dass es immer noch ein gültiges Objekt ist.
Ich frage mich nur, ob der Akt des Aufrufs in dispatch_async die Argumente beibehalten wird. Ich könnte natürlich eine NSInvocation verwenden und selectorOnMainThread ausführen, die es behalten würde.
Sorry - sel wird von der init zurückgegeben. Ich habe das nicht zu meiner Frage hinzugefügt, aber es ist dort im ursprünglichen Code. – Trygve
Josh hat Recht (siehe unten). Siehe [Objective-C-Blöcke] (https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Blocks/Articles/bxVariables.html#//apple_ref/doc/uid/TP40007502-CH6-SW4). in _Blocks Programmierungsthemen: Blöcke und Variablen._ – Rob