Ich habe ein Problem mit NSObject-Instanzen freizugeben, wenn ich nicht erwarte. Ich habe eine Formularvariable vom Typ NSNumber, in Button1 erstelle ich eine Instanz und setze einen Wert, in Button2 lese ich den Wert. Wenn ich nicht in Taste 1 zurückhalte, dann wird die Variable freigegeben und die App hängt, wenn ich auf Button2 klicke, fügt einen Call hinzu, um zu behalten, dass alles funktioniert.Delphi XE6 ARC auf OSX release Variablen
Dies ist auf OSX mit Delphi XE6 mit Firefemonkey.
Hier einige Code
eine Form Variable vom Typ definieren NSNumber
Fv : NSNumber;
Jetzt ein paar
Schaltflächen hinzufügenfür Button1Click
begin
Fv := TNSNumber.Wrap(TNSNumber.OCClass.numberWithFloat(4.0));
ShowMessage(IntToStr(Fv.retainCount)); // value is 1
Fv.retain; // comment out this to make it crash on button2 click
ShowMessage(IntToStr(Fv.retainCount)); // value is 2, or 1 without the retain
end;
für Button2click
Nun scheint am Ende von Button1 Klick zu sein, delphi gibt Fv frei, indem es die Referenzzählung dekrementiert - d. H. Es verhält sich so, als ob es den Gültigkeitsbereich verlässt. Um Fv herumhängen zu lassen, muss ich Fv.retain hinzufügen. Wenn ich auf Button2 ohne den Retain klicke, stürzt es ab.
Sollte ich einbehalten - ich dachte nicht, dass es notwendig war, oder verpasse ich etwas anderes?
tia
Das Gleiche passiert beim Targeting von iOS. Wenn ich Objective-C-Objekte umschließe, muss ich manchmal zurückrufen, manchmal nicht. Ich habe nicht herausgefunden, was der Unterschied ist - aber es ist leicht zu erkennen, wann er benötigt wird :-) – Hans
Ich wusste nicht, dass der OS X-Compiler von XE 6 ARC implementiert hat. Ich dachte nur iOS und Android? –
FWIW, 'numberWithFloat()' erzeugt wahrscheinlich eine Autorelease-Variable (die meisten "Convenience-Konstruktoren" tun dies). Diese müssen in der Tat beibehalten werden, um sie länger zu halten, als bis zum nächsten Autorelease-Zyklus. –