2012-04-20 63 views
0

我剛開始iOS應用程序的開發,我的問題涉及簡單的數組。我的應用程序,這是一個遊戲,大量使用CGPoint結構。因爲它不是一個對象,我不能直接把它放在一個NSArray中,而必須把它包裝在一個NSValue中。這工作正常。陣列內存管理(不NSArray,但類型[23])

在其他的,大多是示例代碼中,我看到的簡單的數組的使用(我想這是C 2):

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

在哪裏分配的內存?何時解除分配?當我傳遞它時會發生什麼?它是否被複制?我在ObjectiveC上找不到關於這個主題的任何內容,但我不確定在哪裏尋找。

紅利問題:這與NSArrays與NSValues相比如何?速度更快嗎?

回答

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)。

是的,它幾乎肯定會比使用NSArray/NSValue更快。

1

right - CGPoint只是一個C結構。

分配內存在哪裏?

在堆棧上聲明。

如果您使用的是malloc,那麼它會在堆上(除非優化出來)。

什麼時候解除分配?

聲明爲,當範圍退出時,該區域可在棧上重用。

如果你想malloc編輯它,你必須free它。

當我傳遞它時發生了什麼?它是否被複制?

這取決於你如何傳遞它。該語言提供了按價值和參考傳遞的選項。

我在ObjectiveC上找不到關於此主題的任何內容,但我不知道在哪裏尋找。

一個C書

獎金問題:請問這個比較NSArrays與NSValues?速度更快嗎?

堆棧分配和對象waaaaaay更快,雖然他們可以被濫用,並有良好的用途。

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; 
} 

這是完全合法的,整個結構是複製從堆棧作爲返回值。

紅利問題:這與NSArrays與NSValues相比如何?速度更快嗎?

試試看,但我會告訴你答案是肯定的。沒有Objective-C消息傳遞。