2017-02-13 5 views
1

Ich habe eine NSObject-Klasse 'DataDownload_A' zum Herunterladen von Daten. Inside benutze ich NSURLSession und NSURLSessionTask. Jetzt ist das Problem, wenn ich dieses Objekt auf Null setze, wird die Dealloc nicht aufgerufen. Hier ist ein Segment-Code von DataDownload_A:Objekt Dealloc wird nicht aufgerufen, wenn NSURLSessionTask Lebenslauf heißt

NSString *urlString = [self URL]; 
    NSURL *url    = [NSURL URLWithString:urlString]; 
    NSURLRequest *theRequest = [NSURLRequest requestWithURL:url 
               cachePolicy:NSURLRequestUseProtocolCachePolicy 
              timeoutInterval:60.0]; 

    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 

    self.session = [NSURLSession sessionWithConfiguration:configuration 
               delegate:self 
              delegateQueue:nil]; 
    self.receivedData = [NSMutableData data]; 

    self.task = [self.session dataTaskWithRequest:theRequest]; 
    [self.task resume]; 

Und wenn ich kommentieren Sie die letzten beiden Zeilen 'self.task = [self.session dataTaskWithRequest: theRequest];' und '[self.task resume];' wird dealloc aufgerufen. Daher nehme ich an, dass es einige Probleme geben muss, wenn ich sie verwende. Ich habe versucht, '[self.task cancel]', 'self.task = nil', '[self.session invalidateAndCancel];' und '[self.session resetWithCompletionHandler: nil];' bevor ich mein Objekt auf Null setze. Aber hat nicht geholfen.

Also weiß jemand, was der Fehler, den ich gemacht habe ?? Würde dankbar sein, mich wissen zu lassen. Vielen Dank im Voraus.

+0

Hmm, ich löschte meine Antwort, aber Ihre [Aufgabe abzubrechen] und Aufgabe = Nil, sollte Dealloc aufrufen, aber es scheint, dass Sie etwas anderes haben, einen starken Bezug zu Ihrem "DataDownload_A", Sie sollte den Code für Ihren "DataDownload_A" -Aufrufer veröffentlichen. –

+0

danke. Schleichen. Ich werde es versuchen. –

Antwort

2

Es sieht so aus, als ob die URLSession einen starken Verweis auf ihren Delegaten enthält. Ich fand diese Linie in der Dokumentation auf URLSession:

Wichtig: Das Sitzungsobjekt zu den Delegierten eine starke Referenz hält bis Ihre Anwendung explizit die Sitzung ungültig. Wenn Sie die Sitzung nicht ungültig machen, verliert Ihre App Speicher.

Das Bit macht es klingen wie ein URLSession seinem Delegierten von dem Moment eine starke Referenz hält es aufgestellt, bis sie ungültig ist oder die App beendet wird, aber es kann sein, dass es nur eine starke Referenz erzeugt, wenn eine Daten (oder andere) Aufgabe wird gestartet.

Es klingt wie Sie die URLSession ungültig machen müssen, damit es seinen Delegaten freigibt. Ich schlage vor, nach dem Text in der URLSession Dokumentation in Xcode zu suchen. Suche auch nach "invalidate"

+0

Hallo Duncan C .. Ihre Antwort ist ziemlich nah, um mein Problem zu lösen, und das inspirierte mich, meine Sitzungsvariable zu überprüfen .. Ich habe Sitzung ungültig aufgerufen, bevor ich mein Objekt auf Null gesetzt ... aber meine Sitzung ist mit "behalten" festgelegt. Also nach dem Zurücksetzen auf 'stark' ... funktioniert es zum Dealloc. Vielen Dank. –

Verwandte Themen