Objective-C适当使用autorelease?

时间:2010-09-25 19:23:39

标签: c++ objective-c autorelease

我正在学习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]];

感谢。

2 个答案:

答案 0 :(得分:1)

是的,这恰恰是autorelease的恰当用法,事实上大多数人使用您的代码都会完全期望crossnormalizemultiply返回自动发布对象

答案 1 :(得分:1)

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

如果您没有这样做,静态分析仪会发出警告,请确保打开它。

你不应该从我那里学习内存管理规则,你应该从apple学习内存管理规则。 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中做不同事情的原因。