objective c - öffnen - ViewController reamsToSelector: Nachricht, die an freigegebene Instanz gesendet wird(CRASH)




outlook öffentlichen kalender hinzufügen (5)

Für alle, die es nicht lösen können, hier sind einige andere Techniken:

https://stackoverflow.com/a/12264647/539149

https://stackoverflow.com/a/5698635/539149

https://stackoverflow.com/a/9359792/539149

https://stackoverflow.com/a/15270549/539149

https://stackoverflow.com/a/12098735/539149

Sie können Instrumente in Xcode 5 ausführen, indem Sie auf das Projekt-Popup-> Schema bearbeiten ... Profil -> Instrument klicken und Verteilungen oder Lecks auswählen, dann Ihre App profilieren, dann Instrumente stoppen, auf die Info-Schaltfläche in Verteilungen klicken und "NSZombie-Erkennung aktivieren" .

Für die Nachrichten, die direkt aus dem com.apple.main-Thread kommen, wird dies jedoch wahrscheinlich nichts ergeben.

Ich knallte dafür über zwei Stunden lang meinen Kopf und die Antwort stellte sich als eine Über-Entlassung heraus, die ich entdeckte, indem ich eine Kopie meines Projekts mit roher Gewalt kommentierte, bis ich den Schuldigen fand:

[viewController release];
viewController = NULL;

Das Problem ist, dass die Freigabe die Variable nicht auf NULL setzt.

Das heißt, dass das Setzen auf NULL-Aufrufe wieder freigegeben wird, indem der Refcount dekrementiert wird und der Speicher sofort freigegeben wird, bis später die Variablen, die auf viewController verweisen, damit fertig sind.

Aktivieren Sie entweder ARC oder stellen Sie sicher, dass in Ihrem Projekt immer Release oder NULL, aber nicht beide verwendet werden. Ich bevorzuge die Verwendung von NULL, da es dann keine Möglichkeit gibt, auf einen Zombie zu verweisen, aber es macht das Finden schwieriger, wo Objekte freigegeben werden.

Ok, hier ist der Deal, ich hasse es, Fragen zu meinem Debugging und Abstürzen zu stellen. Weil ich normalerweise selbst mit ihnen hantiere, aber ich komme einfach nicht herum, auch nachdem ich schon mehrere Fragen gesehen habe .

Ok, hier ist das Problem, ich finde meine App zufällig ein- und ausgeschaltet mit diesem Stack-Trace:

*** -[ViewController respondsToSelector:]: message sent to deallocated instance 0x1e5d2ef0

Wo ViewController variieren kann, hat manchmal der Ort, an dem mein Code abstürzt, KEINE Relevanz für diesen bestimmten ViewController und besitzt oder ruft ihn nicht auf.

Um diese Konsolenspur zu bekommen, habe ich auch Zombies aktiviert, sonst würde ich überhaupt keinen Konsolenabdruck bekommen, ich würde nur bekommen: objc_msgSend , was ich weiß, bedeutet dass ich etwas objc_msgSend , das veröffentlicht wird. Aber ich kann nicht finden, wo das ist ... Ich stecke wirklich fest! Normalerweise debugge ich immer meine Abstürze, also bin ich wirklich fest daran.

Auch dies stürzt an verschiedenen Orten zu unterschiedlichen Zeiten ab und wieder ab. Und der Ort, an dem es abstürzt, hat fast keine Relevanz für den ViewController . Und ich finde das sehr verwirrend.

Brauchst du irgendeinen Code? Ich habe viele Dateien und da es an verschiedenen Orten abstürzt, wird die Verteilung meines Codes ein Durcheinander sein!

Ich habe versucht, symbolische Breakpoints ohne Glück hinzuzufügen, und Zombies ist in der App Instruments für iOS nicht verfügbar. Ich kann meine App nicht auf dem Simulator ausführen, da sie nicht unterstützende Architektur-Frameworks enthält.

Danke an alle ...


Hatte das gleiche Problem in OS X.

Um dies zu lösen nicht genug - (void)dealloc Methode wie @SoftwareEvolved bereits gesagt. Aber leider - (void)viewWillDisappear ist nur auf Version 10.10 und - (void)viewWillDisappear verfügbar.

Ich führte in meiner NSViewController-Unterklasse eine benutzerdefinierte Methode ein, in der alle Zombie-gefährlichen Referenzen auf Null gesetzt wurden. In meinem Fall waren das NSTableView Eigenschaften ( delegate und dataSource ).

- (void)shutdown
{
  self.tableView.delegate = nil;
  self.tableView.dataSource = nil;
}

Das ist alles. Jedes Mal, wenn ich die Ansicht aus dem Superview entfernen möchte, muss diese Methode aufgerufen werden.


Ich hatte das gleiche Problem. Es war schwierig zu finden, welches Delegierte Ursache Problem, weil es keine Zeile oder Code-Anweisung anzeigt Also habe ich versucht, irgendwie, Vielleicht wird es hilfreich für Sie.

  1. Öffnen Sie die XIB-Datei und klicken Sie auf den Besitzer der Datei. Wählen Sie rechts im Menü "Verbindungsinspektor anzeigen". Delegierte werden aufgelistet und auf Null gesetzt, die verdächtigt werden.
  2. (Wie in meinem Fall) Property Object wie Textfield kann ein Problem verursachen, also setze seine Delegaten auf null.
-(void) viewWillDisappear:(BOOL) animated{

[super viewWillDisappear:animated];

if ([self isMovingFromParentViewController]){

self.countryTextField.delegate = nil;

self.stateTextField.delegate = nil;

}

}

Ich hatte ein sehr ähnliches Problem, und ich fand heraus, dass dies auf die Delegierten der Navigationscontroller zurückzuführen war.

Das Unten löste mein Problem,

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    if (self.navigationController.delegate != self) {
        self.navigationController.delegate = self;
    }
}

-(void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    if (self.navigationController.delegate == self) {
        self.navigationController.delegate = nil;
    }
}

hatte ein ähnliches Problem. In meinem Fall musste ein ViewController navigationController-Events abrufen, damit er sich als Delegierter des Navigationscontrollers registrieren konnte:

 self.navigationController.delegate = self;

Der Absturz tritt auf, wenn dieser Controller freigegeben wurde, aber immer noch der Delegat für den Ansichtscontroller war. Das Hinzufügen dieses Codes in dealloc hatte keine Auswirkungen:

-(void) dealloc
{
    if (self.navigationController.delegate == self)
    {
        self.navigationController.delegate = nil;
    }

Da an dem Punkt, an dem dealloc aufgerufen wird, der View-Controller bereits aus der View-Hierarchie entfernt wurde, ist self.navigationController gleich null, so dass der Vergleich garantiert fehlschlägt! :-(

Die Lösung bestand darin, diesen Code hinzuzufügen, um zu erkennen, dass der VC die Ansichtshierarchie verlassen hat, bevor er dies tatsächlich tut. Es verwendet eine in iOS 5 eingeführte Methode, um zu bestimmen, wann die Ansicht geöffnet und nicht gedrängt wird

-(void) viewWillDisappear:(BOOL) animated
{  
   [super viewWillDisappear:animated];
   if ([self isMovingFromParentViewController])
   {
      if (self.navigationController.delegate == self)
      {
           self.navigationController.delegate = nil;
      }
   }
}

Keine Abstürze mehr!





crash