【问题标题】:Array memory management (Not NSArray, but type[23])数组内存管理(不是 NSArray,而是 type[23])
【发布时间】:2012-04-20 13:15:29
【问题描述】:

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

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

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

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

额外问题:这与带有 NSValues 的 NSArrays 相比如何?是不是更快?

【问题讨论】:

    标签: objective-c


    【解决方案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 更快。

    【讨论】:

      【解决方案2】:

      对 - CGPoint 只是一个 C 结构。

      内存分配在哪里?

      按照声明,在堆栈上。

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

      什么时候解除分配?

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

      如果你要malloced,你必须free它。

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

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

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

      一本C书

      额外问题:这与带有 NSValues 的 NSArrays 相比如何?是不是更快?

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

      【讨论】:

        【解决方案3】:

        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 消息。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多