我在使用NSObject实例时遇到了一些问题,不符合我的预期实例被释放了。我有一个NSNumber类型的表单变量,在button1中我创建了一个实例并设置了一个值,在button2中我读取该值。如果我不在button1中调用retain,那么该变量将被释放,并且当我点击button2时应用程序将挂起,添加一个retain调用可以使一切正常。
这是在OSX上使用Delphi XE6和FireMonkey。
下面是一些代码:
定义一个NSNumber类型的表单变量:
现在添加几个按钮
用于 Button1Click
现在发生的情况是,在 Button1 点击结束时,Delphi 通过减少引用计数释放 Fv,即它的作用相当于超出范围。因此,为了让 Fv 延续存在,我必须添加 Fv.retain。如果我没有使用 retain 单击 Button2,则会导致崩溃。
这是在OSX上使用Delphi XE6和FireMonkey。
下面是一些代码:
定义一个NSNumber类型的表单变量:
Fv : NSNumber;
现在添加几个按钮
用于 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;
对于Button2click
begin
ShowMessage(IntToStr(Fv.retainCount)); // value is 1 or crashes without the retain
ShowMessage(FloatToStr(Fv.doubleValue));
end;
现在发生的情况是,在 Button1 点击结束时,Delphi 通过减少引用计数释放 Fv,即它的作用相当于超出范围。因此,为了让 Fv 延续存在,我必须添加 Fv.retain。如果我没有使用 retain 单击 Button2,则会导致崩溃。
我应该添加一个 retain 吗?我原本认为这不是必要的,还是我遗漏了其他方面?
tia
numberWithFloat()
可能会生成一个自动释放变量(大多数“便利构造函数”都是如此)。这些变量确实需要保留,以使它们的生命周期超过下一个自动释放周期。 - Rudy VelthuisMacapi.Foundation.pas
中的type NSNumber = interface(NSValue)
。 - Remy Lebeau