【问题标题】:Delphi: ARC and Objective-C wrapped objects - how to release?Delphi:ARC 和 Objective-C 包装的对象 - 如何释放?
【发布时间】:2017-09-16 00:22:53
【问题描述】:

在 Delphi/FMX 中,导入包装类和接口表示的 Objective-C 对象没有 ARC。

在处理 Objective-C 对象时,你必须调用 retain 和 在正确的点释放自己。分配一个新的 Objective-C 对象会将其引用计数初始化为 1 并调用 release 会将其降至 0 从而破坏它。 http://ridingdelphi.blogspot.de/2014/01/the-quest-to-migrate-ios-squarecam-app_3169.html

例如,我想动态创建一个 UILabel。根据上面的参考,我的代码应该是这样的(我假设我已经正确选择了零售和发布的位置):

    procedure TForm1.Button1Click(Sender: TObject);
    var
      lbl: UILabel;
    begin
      lbl := TUILabel.Wrap(TUILabel.alloc.init);
      lbl.retain;
      ...
      lbl.release;
    end;

它不起作用。在 Delphi/FMX 中释放包装的 Objective-C 对象的正确方法是什么?

“它不起作用”我的意思是 UILabel 没有按预期释放,并且仍然分配内存。我在 Xcode 分配工具的帮助下找到了这个。

【问题讨论】:

  • “它不起作用”我的意思是 UILabel 没有按预期释放,并且仍然分配内存。我在 Xcode 分配工具的帮助下找到了这个。
  • @TomBrunberg 当然,我已经尝试过所有这些。该对象只是卡在内存中。
  • 好的,希望iOC 有更好知识的人能尽快回答。顺便说一句,您可以在评论结束后立即使用删除按钮删除不相关的 cmets(悬停评论时可见)。

标签: ios objective-c delphi automatic-ref-counting firemonkey


【解决方案1】:

TUILabel.alloc.init 将引用计数加一。在您致电retain 之后,您的引用计数为 2。但是你只释放一次对象。

所以你要么必须拨打release 两次:

procedure TForm1.Button1Click(Sender: TObject);
var
  lbl: UILabel;
begin
  lbl := TUILabel.Wrap(TUILabel.alloc.init);
  lbl.retain;
  ...
  lbl.release;
  lbl.release;
end;

或者删除对retain的调用:

procedure TForm1.Button1Click(Sender: TObject);
var
  lbl: UILabel;
begin
  lbl := TUILabel.Wrap(TUILabel.alloc.init);
  ...
  lbl.release;
end;

【讨论】:

    猜你喜欢
    • 2010-12-22
    • 2011-01-26
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多