EXC_BAD_ACCESS mit sortUsingComparator

8

Ich verstehe, was der Fehler EXC_BAD_ACCESS im Allgemeinen bedeutet, aber ich bin verwirrt darüber, was in meinem Fall passiert.

Ich habe eine benutzerdefinierte Klasse mit einer NSComparator Eigenschaft sortWithThisComparator . Wenn diese Eigenschaft vom Benutzer festgelegt wird, wenn ich ein Element in das Klasseneigenschaftsarray der Instanz items einfüge, verwende ich den Komparator, um den Einfügeort zu bestimmen:

%Vor%

Alles funktioniert gut, wenn ich keinen Komparator einstelle, aber wenn ich den Komparator verwende, bekomme ich einen schlechten Zugriffsfehler:

%Vor%

Ich erhalte einen schlechten Zugriffsthread in der zweiten Zeile des Komparators, der einfach einen der über den NSComparator übergebenen Parameter protokolliert. Aber die Klasseninstanzen, die ich an die insertItem übergebe, sind woanders ohne dieses Problem zugänglich, daher weiß ich, dass sie ordnungsgemäß instanziiert wurden und ansonsten ordnungsgemäß übergeben werden, da ich sie ohne einen Vergleicher in die Eigenschaft items einfügen kann. Was fehlt mir hier?

Weitere Details. Ich speichere den NSComparator als

%Vor%     
sunny 03.02.2016, 12:23
quelle

2 Antworten

1

Tatsächlich kann ich nur einige Annahmen gemäß den oben erwähnten Codes treffen.

Für den ersten Block, ich denke, self.items ist ein veränderbares Array. Auch in der Funktion insertItem: , sobald sortWithThisComparator nicht nil ist, wird ein neues Objekt eingefügt, nachdem ein Sortierprozess einen Index erhalten hat.

Da Sie bei Threadproblemen einen schlechten Zugriff erhalten, haben Sie in Ihren Codes nicht auf das Threading geachtet.

Hier sind einige Vorschläge:

  • NSMutableArray ist nicht threadsicher: Ich denke, Sie haben self.items Operation in einem asynchronen Thread. Wenn ich recht habe, erinnere dich daran, dass du NSLock hast, wenn du self.items bearbeiten willst um es zu schützen.

Beispiel:

%Vor%
  • Eine andere ist die Sortierung basierend auf einem veränderbaren Array: Ich denke, es ist gefährlich auch da veränderbares Array nicht threadsicher ist.

Sehen wir uns diese Zeile an:

%Vor%

Meiner Meinung nach würde ich zuerst eine Array-Kopie machen und Optionen mit NSBinarySearchingInsertionIndex :

setzen %Vor%
  • Außerdem habe ich eine Situation gefunden, die sich auszahlen könnte Null und du machst ein NSMakeRange(0, self.items.count) . Vermutlich überarbeiten Sie auch den Zustand kleines Bit in Funktion insertItem: ,
%Vor%

Das sind einige Gedanken, die ich bei dieser Bewegung habe. Ich werde mehr hinzufügen, sobald ich Ideen für andere Möglichkeiten bekomme.

    
Allen 07.02.2016 07:08
quelle
0

Was ich vermute, ist die Verwendung von sortWithThisComparator , die Sie als Variable und nicht als Eigenschaft verwenden. Versuchen Sie, sortWithThisComparator durch self.sortWithThisComparator zu ersetzen. Lassen Sie mich wissen, ob es hilft

    
aman.sood 10.02.2016 10:58
quelle