2013-12-18 11 views
9
-(void) scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    PO(NSStringFromCGPoint(self.tableView.contentOffset)); 
    PO(NSStringFromUIEdgeInsets(self.tableView.contentInset)); 

    while(false); 
} 

-(void)dealloc 
{ 
    PO(NSStringFromClass([self class])); 
    PO(@"Deallocated"); 
    self.tableView.delegate=nil; 
} 

Hier muss ich self.tableView.delegate = nil setzen, um Fehler zu vermeiden.Warum setzen wir den Delegaten bei dealloc auf null, wenn das Objekt trotzdem zerstört wird?

Ich bin mir bewusst, von meiner vorherigen Frage, dass self.tableView.delegate wird nicht automatisch Null, wenn der Delegat zerstört wird. Das liegt daran, dass der Typ des Delegaten eine Referenz anstelle einer schwachen Referenz zuweist.

Was ist jedoch mit self.tableView?

Die einzige Sache mit starkem Verweis auf self.tableView ist es Superview, das von Selbst- und Selbstbesitz gehört.

Also wenn self zerstört wird, sollte self.tableView auch zerstört werden und das bedeutet, dass self.tableView.delegate auch weg ist.

Also warum muss ich self.tableView.delegate=nil setzen;

Antwort

5

Wenn Sie den einzigen Verweis auf self.tableView haben, müssen Sie den Delegaten nicht auf null setzen.

Die einzige Situation, in der Sie den Delegaten auf Null setzen müssen, wenn eine andere Klasse Ihre Klasse als Delegat hat, denn wenn Ihre Klasse zerstört wird, sucht diese andere Klasse nach Ihrer Klasse, um einige Methoden zu implementieren, und Ihre Anruf wird nicht da sein.

-1

Eigentlich ist dies nicht erforderlich. Wir tun dies, um einen Rückhaltezyklus zu vermeiden. Wir sollten keinen Delegierten mit starker Referenz erstellen. Wenn Sie versehentlich einen Delegaten mit einer starken Referenz erstellt haben, werden sowohl die Eltern als auch die untergeordneten Elemente nicht freigegeben. In diesem Fall wird Dealloc selbst nicht aufgerufen. Also ist es nicht notwendig.

9

In vielen Fällen müssen Sie Delegat auf Null setzen. In Ihrem Fall kann tableView von einer externen Klasse referenziert werden und wird nach der Dealloc-Methode Ihrer Klasse nicht zerstört. Und wird weiterhin seine Delegate-Methode aufrufen, die zum Absturz führt. Es gibt mehrere Klassen, die in einem anderen Thread funktionieren (z. B. NSURLConnection). Selbst wenn Sie es freigeben, kann es weiterhin Delegate-Methoden aufrufen, da es in einem anderen Thread beibehalten wird.

0

Können sagen, wir haben eine SpriteKitscene, wo Sie eine haben gesture recognizer und Sie setzen ihre delegate.

Dann Sie dealloc diese scene und ihre recognizer von seiner controller.

Es würde zu crash führen, wenn die delegate Methode in scene während dieses Prozesses aufgerufen wurde.

Verwandte Themen