【问题标题】:Objective-C: If I return a C++ object in a function in ARC, will it create a copy and do I have to manually release that copy?Objective-C:如果我在 ARC 的函数中返回一个 C++ 对象,它会创建一个副本吗?我是否必须手动释放该副本?
【发布时间】:2013-04-24 23:43:07
【问题描述】:

我正在尝试在 Objective-C 中传递对 C++ 对象的引用,因此我可以从另一个类访问该对象,具体来说:

// ClassA
-(b2World *)getWorld{
    return world;
}

在另一个类中,我会将返回的对象分配给 ivar

// ClassB
-(void)initClassB{
    world_ = [ClassA getWorld];
}

或者直接访问返回对象的方法

// Classb
-(void)doSomething{
    [[ClassA getWorld] doSomething];
}

在这两种情况下复制 c++ 对象 (b2World) 并且我必须在 ARC 环境中手动释放复制的对象是否正确?如果是这样,在 ARC 中传递 c++ 对象的最佳做法是什么(不应转移传递对象的所有权,例如,它应该是弱引用)?

感谢您的帮助。

【问题讨论】:

  • 你必须告诉 ARC,这是为了让它的手指远离那个指针! (我从来没有这样做过,所以我不知道要使用的确切 _whatever 修饰符。)
  • @HotLicks 用于正确定义的 C++ 类,但情况并非如此。 ARC 比这要聪明得多,并且只保留带有 __attribute__((NSObject)) 声明的类型的指针。

标签: c++ objective-c memory-management automatic-ref-counting objective-c++


【解决方案1】:

你没有返回一个对象。您正在返回一个指针。任何地方都不会进行复制。

另外,您的第三个代码示例将永远无法工作,因为您说b2World 是一个 C++ 对象,这意味着它不可能响应 obj-c 消息。

此外,ARC 不会影响 C++ 的语义(除非您将 obj-c 对象嵌入为 C++ 对象的成员变量)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 2018-09-20
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    相关资源
    最近更新 更多