NSInvokations- und Speicherprobleme [duplizieren]

8

Ich komme also aus der Java-Welt, in der wir Fragen des Speichermanagements glücklicherweise nicht kennen. Zum größten Teil hat ARC meinen Hintern gerettet, aber hier ist etwas, das mich ratlos gemacht hat. Im Grunde verwende ich NSInvocations für einige Sachen, und ich stieß in einige fiese Gedächtnisprobleme, bevor ich die folgenden Codeänderungen machte. Seit ich diese Modifikationen vorgenommen habe, sind die Speicherabstürze verschwunden, aber ich habe normalerweise große Angst vor Code, den ich nicht verstehe. Mache ich das richtig?

Vorher: Alle Arten von Speicherproblemen:

%Vor%

Nachher: ​​Keine Speicherprobleme, aber ich bin mir nicht sicher, ob ich das richtig verstanden habe:

%Vor%

Bearbeiten:

Ich wollte nur auf der Grundlage der folgenden Antwort hinzufügen, ich habe objc_msgSend als solche.:

%Vor%

Und es löst alle Speicherprobleme und sieht viel einfacher aus. Bitte kommentiere, wenn du Probleme damit siehst.

    
user2453876 07.07.2013, 06:01
quelle

2 Antworten

5

Ich beantworte Ihre Frage so: Verwenden Sie nicht NSInvocation . Es ist nur ein freundlicher Hinweis, um wenn möglich zu vermeiden.

Es gibt viele schöne Möglichkeiten Callbacks in Objective-C zu machen, hier sind zwei, die für Sie nützlich sein könnten:

  • Blöcke : Im Kontext definiert, wählen Sie eine beliebige Anzahl und Typen von Argumenten, mögliche Probleme mit dem Speicher auch. Es gibt viele Ressourcen, wie man sie benutzt.
  • performSelector : Maximal 2 Objektargumente, die mit:

    aufgerufen werden %Vor%

Wenn ich einen Selektor mit 4 Argumenten aufrufen muss, verwende ich immer noch nicht NSIvocation , sondern rufe objc_msgSend direkt an:

%Vor%

Einfach.

Bearbeiten: Bei objc_msgSend müssen Sie vorsichtig mit dem Rückgabewert sein. Wenn Ihre Methode ein Objekt zurückgibt, verwenden Sie das obige. Wenn ein primitiver Typ zurückgegeben wird, müssen Sie die objc_msgSend -Methode umsetzen, damit der Compiler weiß, was vor sich geht ( siehe diesen Link ). Hier ist ein Beispiel für eine Methode, die ein Argument akzeptiert und ein BOOL zurückgibt:

%Vor%

Wenn Ihre Methode eine Struktur zurückgibt, sind die Dinge etwas komplizierter. Sie können (aber nicht immer) objc_msgSend_stret - siehe hier für weitere Informationen .

Bearbeiten: - diese Zeile muss zum Code hinzugefügt werden, oder Xcode wird sich beschweren:

%Vor%

oder

%Vor%     
Tricertops 07.07.2013, 07:16
quelle
4

Wenn möglich, sollten Sie Blöcke generell als eine bessere Alternative betrachten (ihnen ist NSInvocation gelungen).

Bis zum Rückgabewert können Sie Folgendes verwenden:

%Vor%

Das zugrundeliegende Problem hier ist, dass -getReturnValue: kein out Objekt zurückgibt, was ARC betrifft. Daher ist es wahrscheinlich, dass die Referenzzähloperationen falsch sind (der Compiler fügt diese in ARC für Sie hinzu), weil der Parameter -getReturnValue: void* ist, kein out-Objekt (z. B. NSObject** ).

    
justin 07.07.2013 07:06
quelle