我正在学习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]];
感谢。
答案 0 :(得分:1)
是的,这恰恰是autorelease
的恰当用法,事实上大多数人使用您的代码都会完全期望cross
,normalize
和multiply
返回自动发布对象
答案 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中做不同事情的原因。