1

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

谢谢。

4

2 回答 2

1

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

于 2010-09-25T19:27:08.540 回答
1

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

如果您未能执行此操作,静态分析器会警告您,请确保已将其打开。

你不应该向我学习内存管理规则,你应该向苹果学习内存管理规则。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 更有用。

Just a quick point, you say "in objective-c I can't return an object, only an object pointer". This is exactly the same as in Java and C++, and isn't a reason why you would do things differently in objective-c.

于 2010-09-25T20:49:59.200 回答