期待していないときに解放されるNSObjectインスタンスに問題があります。私はNSNumber型のフォーム変数を持っています、私はインスタンスを作成し、値を設定するbutton1で、私は値を読み取るbutton2で。ボタン1でretainを呼び出さないと、変数は解放され、button2をクリックするとアプリケーションが停止し、retainを呼び出すとすべてが機能します。OSXリリース変数のDelphi XE6 ARC
これは、firefoxでDelphi XE6を使用しているOSX上です。ここで
は、いくつかのコード
今Button2click
ためButton1Clickbegin
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;
ためのボタン
のカップルを追加し
Fv : NSNumber;
のNSNumber
タイプのフォーム変数を定義しますbegin
ShowMessage(IntToStr(Fv.retainCount)); // value is 1 or crashes without the retain
ShowMessage(FloatToStr(Fv.doubleValue));
end;
Button1をクリックすると、Delphiは参照カウントを減らしてFvを解放します。つまり、範囲外に出るように動作します。だから、Fvをぶら下げるようにするには、Fv.retainを追加する必要があります。保持なしでbutton2をクリックすると、クラッシュします。
私は保持する必要があります - 私はそれが必要ではないと思った、または私は何か他のものを逃していますか?正しい道に私を置くため@RudyVelthiusと@RemyLebeauへ
TIA
iOSをターゲットにした場合も同じことが起こります。 Objective-Cオブジェクトをラップすると、時にはretainを呼び出す必要があり、時にはそうでない場合もあります。違いが何であるか分かりませんが、保持が必要なときに検出するのは簡単です:-) – Hans
XE 6のOS XコンパイラがARCを実装していることはわかりませんでした。私はiOSとAndroidだけを考えましたか? –
FWIWでは、 'numberWithFloat()'はおそらくautorelease変数を生成します(ほとんどの場合、便利なコンストラクタが行います)。これらは、次回の自動解放サイクルが実行されるまで、それらを長く保つために保持する必要があります。 –