2013-03-27 147 views
0

每個人。我的「engrish」不是很好,但我希望你能理解我的問題。在循環中聲明一個指針

比方說,我有這樣的

-(id) init 
{ 
    if (self = [super init]) 
    { 
     deck = [[NSMutableArray alloc] initWithCapacity:52]; 
     Card *newCard = [[Card alloc] init]; 

     for (int suit = 0; suit < 4; suit++) 
      for (int rank = 0; rank < 13; rank++) 
      { 
       newCard.suit = suit; 
       newCard.rank = rank; 
       [deck addObject:newCard]; 
      } 
     [newCard release]; 
    } 
    return self; 
} 

我感覺像我在前面提到的代碼錯誤代碼。我想在嵌套循環中創建52個不同的對象並添加數組中的每個對象。但我懷疑我會有52個相同的對象,並在數組中將52指針指向相同的地址,對不對?

如果我這樣做,會發生什麼。

-(id) init 
{ 
    if (self = [super init]) 
    { 
     deck = [[NSMutableArray alloc] initWithCapacity:52]; 

     for (int suit = 0; suit < 4; suit++) 
      for (int rank = 0; rank < 13; rank++) 
      { 
       Card *newCard = [[Card alloc] init]; // I guess every time newCard 
       newCard.suit = suit;     // created, it will point to 
       newCard.rank = rank;     // another chunk of memory, 
       [deck addObject:newCard];   // right? 
       [newCard release] // Should I release newCard every time? 
      } 
    } 
    return self; 
} 

那麼我可以創建52個不同的卡片? 謝謝。如果您需要更多解釋,請問我。

+0

你嘗試運行它,並使用的NSLog到打印出甲板的結果?即'NSLog(「%@」,deck);'。 - 你是對的,雖然 – gaige 2013-03-27 09:45:35

+0

如果你不使用ARC,那麼是的 - 你需要釋放它。 – Eimantas 2013-03-27 09:47:12

+0

請使用ARC;)你不能做得更好。 – HAS 2013-03-27 09:53:21

回答

0

第一個問題:您的第二個代碼sniplet生成52個單獨的對象,您將其添加到數組中。 第一個sniplet,正如你自己建議的那樣,只產生一個添加到數組中的對象。由於它只是一個對象,因此只有陣列的所有成員纔會攜帶相同的值.suit.rank

Als已經建議,當你記錄這些對象時,你至少可以看到它們在內存中的地址。當地址相同時,它是相同的對象。

第二個問題: 是的,你應該釋放它,除非你使用ARC。 addObject將自動保留每個添加的對象,並在從陣列中移除時釋放它。因此,稍後從數組中獲取對象並打算進一步使用它時要小心。那麼你可能不得不再次保留它。

替代你-correct-代碼,你可以使用自動釋放對象:

 Card *newCard = [[[Card alloc] init] autorelease]; // I guess every time newCard 
     newCard.suit = suit;     // created, it will point to 
     newCard.rank = rank;     // another chunk of memory, 
     [deck addObject:newCard];   // right? 
     //[newCard release]; // not required, autoreleased 

(但是,分號丟失之後釋放的語句。)

+0

我不太明白:指針會發生什麼(比如newCard) ?我們創建一個指針,然後我們發送釋放消息給它指向的一個對象,然後在循環的下一次迭代中,我們創建一個具有相同名稱的指針?那麼前一個指針會發生什麼變化呢? – eoLithic 2013-03-27 10:26:17

+0

那麼,你可以聲明你的指針在這個if和loop中或者沒有,在某些情況下,例如涉及到switch/case的情況,你必須實際創建指針到switch塊之外,在(double)循環中分配對象。自動保留Alloc返回一個保留的對象init也是如此沒有ARC分配的內存將不會被釋放,直到保留計數爲0,這意味着每個分配或保留有一個釋放(或autorelease生效)。 RC內存甚至keesp分配時(繼續下一條評論...) – 2013-03-27 12:27:19

+0

...沒有任何東西指向對象。這就是我們所說的內存泄漏。所以在你的情況下,你在循環的每一次迭代中創建一個新的對象。它由alloc保留並由addObject保留。然後它被釋放。意思是它的保留計數是1,對象保持活着。直到它從數組中移除。 – 2013-03-27 12:29:42