Was verursacht einen SIGSEGV mit Blöcken?

8

Ich habe den folgenden Code. Ich bekomme gelegentlich eine SIGSEGV. Ich habe das Gefühl, dass mir bei der Speicherverwaltung mit Blöcken etwas fehlt. Ist es sicher, die ersetztenUrls zu übergeben, die für diesen Block automatisch freigegeben wurden? Was ist mit der Änderung der Instanzvariablen formatiertText?

%Vor%     
tjg184 01.10.2011, 02:56
quelle

1 Antwort

2

Es scheint, dass das Problem, das Sie haben, mit der Speicherverwaltung zusammenhängt. Sie beginnen mit der Suche nach der Zeichenfolge self.formattedText . Dies bedeutet, dass Ihre NSDataDetector -Instanz während des Suchvorgangs wahrscheinlich auf die Zeichenfolge zugreifen muss, um Zeichen usw. zu lesen. Das funktioniert alles gut und schön, solange self.formattedText nicht freigegeben wird. Normalerweise ist es selbst für Blockmethoden wie diese Aufgabe des Aufrufers, die Argumente bis zum Ende des Funktionsaufrufs beizubehalten.

Wenn Sie innerhalb Ihres Match-Blockes den Wert von self.formattedText ändern, wird der alte Wert automatisch freigegeben (vorausgesetzt, dies ist eine retain -Eigenschaft). Ich bin mir nicht bewusst, dass NSDataDetector Caching durchführen könnte, oder Probleme in Bezug auf Autorelease-Pools usw., aber ich bin ziemlich sicher, dass dies ein Problem verursachen könnte.

Mein Vorschlag ist, dass Sie [NSString stringWithString:self.formattedText] als Argument enumerateMatchesInString: und nicht die Ebene self.formattedText übergeben. Auf diese Weise übergeben Sie dem NSDataDetector eine Instanz, die erst freigegeben wird, wenn der Autorelease-Pool leer ist.

    
Alex Nichol 15.10.2011, 01:16
quelle