【问题标题】:Objective-C appropriate use of autorelease?Objective-C 适当使用 autorelease?
【发布时间】:2010-09-25 19:23:38
【问题描述】:

我正在学习 Objective-C,我正在尝试编写一个 Vector3D 类。

在 C++ 或 Java 中,我想要实现的函数如下所示:

Vector3D
{
  Vector3D crossProduct(Vector3D in)
  {
    Vector3D result;
    result = ...  // maths involving this classes variables and the input Vectors variables.
    return result; 
  }
}

现在在objective-c中我不能返回一个对象,只能返回一个对象指针。这是否是使用自动释放的合适位置(在返回之前?)。这将使我能够链接 Vector3D 类上的方法(因为许多方法返回对象本身)但是与手动分配和释放对象相比,这会特别低效吗?在objective-c中还有其他常用的返回对象的模式吗?

我想对该类进行的操作示例:

Vector3D * vector3D1 = [[Vector3D alloc] init];
Vector3D * vector3D2 = [[Vector3D alloc] init];
Vector3D * vector3D3 = [vector3D1 cross [ [vector3D2 normalize ] multiply 1.43f]];

谢谢。

【问题讨论】:

    标签: c++ objective-c autorelease


    【解决方案1】:

    是的,这正是autorelease 的正确用法,事实上大多数使用您的代码的人都完全期望crossnormalizemultiply 返回一个自动释放的对象。

    【讨论】:

      【解决方案2】:

      如果你创建一个对象,你就“拥有”它。如果您想放弃或转移所有权,您必须自动释放或释放对象。由于您不能释放对象然后返回它,因此您必须自动释放它。请注意,这比“适当使用”要强一些。

      如果你没有这样做,静态分析器会警告你,确保你已经打开它。

      你不应该向我学习内存管理规则,你应该向苹果学习内存管理规则。 http://developer.apple.com/library/mac/ipad/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html%23//apple_ref/doc/uid/20000994-BAJHFBGH

      Cocoa 没有 2d Point 类,而是频繁使用 C 结构(NSPoint 或 CGPoint),这可能是因为效率低下。部分是因为 Apple 的例子,部分是因为担心效率低下,你不会经常看到 3dVector 类。更常见的是,您会看到一个带有 4 个浮点数的 C 结构。这也可能是因为它对 OpenGL 或 OpenCL 更有用。

      只是一个简短的点,你说“在objective-c中我不能返回一个对象,只有一个对象指针”。这与 Java 和 C++ 中的完全一样,并不是您在 Objective-c 中做不同事情的原因。

      【讨论】:

      • 我确实阅读了您链接到的文档,但除了自动释放之外,我还可以使用其他一些选项,例如传递“输出”对象并对其进行修改,而不是返回一个新对象。
      • 在 C++ 中,您可以返回一个对象,在内部它复制该对象,但语法和语义都在那里;对象对象;返回对象:不用担心所有权。
      猜你喜欢
      • 1970-01-01
      • 2012-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多