2016-10-29 3 views
0

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.

+0

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

+0

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

Antwort

5

Die Warteschlange behält den Block bei, wenn er in die Warteschlange gestellt wird, und der Block behält Objekte, die er erfasst, wie beispielsweise self. Da self hier eine starke Bezugnahme auf seine element hat, wird die element zumindest bis nach dem Block gültig sein.

Beachten Sie, dass es ungewöhnlich ist, dass ein Objekt einen starken Verweis auf seinen Delegaten hat: Stellen Sie sicher, dass Sie dort keinen ununterbrochenen Retain-Zyklus haben.

Verwandte Themen