0

我刚刚开始开发 iOS 应用程序,我的问题与简单数组有关。我的应用程序是一个游戏,大量使用了 CGPoint 结构。因为它不是一个对象,所以我不能将它直接放在一个 NSArray 中,而必须将它包装在一个 NSValue 中。这工作正常。

在其他主要是示例代码中,我看到了简单数组的用法(我猜那是 C?):

CGPoint manyPoints[40];
manyPoints[0] = CGPointMake(23, 42);
// And so on...

内存分配在哪里?什么时候解除分配?当我传递它时会发生什么?是抄的吗?关于ObjectiveC,我找不到关于这个主题的任何内容,但我不知道该去哪里找。

奖励问题:这与带有 NSValues 的 NSArrays 相比如何?它更快吗?

4

3 回答 3

1

CGPoint是 C 结构类型。该声明直接在堆栈上分配内存。在 C 中,您可以直接将结构作为值传递。CGPointMake() 可能看起来像这样:

struct CGPoint {
     CGFloat x;
     CGFloat y;
};
typedef struct CGPoint CGPoint;

 CGPoint CGPointMake(CGFloat x, CGFloat y)
 {
     CGPoint returnValue; // allocated directly on the stack
     returnValue.x = x;   // Do not confuse this with Objective-C dot notation.  It is NOT the same thing
     returnValue.y = y;
     return returnValue;
 }

这是完全合法的,整个结构从堆栈中 复制出来作为返回值。

奖励问题:这与带有 NSValues 的 NSArrays 相比如何?它更快吗?

试试看,但我会告诉你答案是肯定的。没有 Objective-C 消息传递要做。

于 2012-04-20T13:29:50.097 回答
1

对 -CGPoint只是一个 C 结构。

内存分配在哪里?

如声明的那样,在堆栈上。

如果您使用过malloc,那么它将在堆上(除非优化出来)。

什么时候解除分配?

如声明的那样,当范围退出时,该区域可在堆栈上重用。

如果你malloc编辑它,你就必须这样free做。

当我传递它时会发生什么?是抄的吗?

这取决于你如何通过它。该语言提供了按值传递和按引用传递的选项。

关于ObjectiveC,我找不到关于这个主题的任何内容,但我不知道该去哪里找。

一本C书

奖励问题:这与带有 NSValues 的 NSArrays 相比如何?它更快吗?

堆栈分配和对象的速度要快得多,尽管它们可能会被滥用并且对所有人都有很好的用途。

于 2012-04-20T13:21:20.417 回答
1

该语句在堆栈上CGPoint manyPoints[40];分配 40 ,这意味着(通常)您不能传递它们。当您离开当前堆栈帧(掉出当前的大括号集)时,数据将自动被释放。CGPoints

您还可以执行以下操作:

CGPoint* manyPoints = malloc(40 * sizeof(CGPoint);

// blah

manyPoints[0] = CGPointMake(23, 42);

// I'm done now
free(manyPoints);

为此,您可能会更幸运地在 C(而不是 Objective C)中进行搜索。

是的,它几乎肯定会比使用NSArray/更快NSValue

于 2012-04-20T13:22:04.540 回答