2012-02-26 74 views
-4

我有一個小問題與ARC,我明白爲什麼它做它做什麼,但不是如何防止它。此代碼是示例「Tick tac toe」遊戲的一部分。ARC(iOS)自動發行問題

問題是在名爲Tile的子循環內分配一個新的UIView。一旦設置完成,我會將TileUIView)添加到當前視圖中,並將其添加到稍後用於參考的遊戲控制器陣列中。

現在的問題是,在循環的每次迭代中,圖塊對象都會自動釋放,並且我希望它們被保留下來,以便將它們存儲在gamecontroler的tile容器中。我如何讓它記住瓷磚?

這是對gameDelegate代碼:

- (void) addTile:(Tile *)tile { 
    NSLog(@"Add tile %@", self.tiles); 
    [tiles addObject:tile]; 
} 

最後添加的輸出是在這裏:

Posted on pastebin.com for better formatting

在這一點上,正如所料,整個局部區塊陣列內遊戲控制器將被輸出並且如預期那樣;有一個Tile對象的列表。

New download link

這是board.m代碼(的UIView子類)。

-(void) drawBoard 
{ 
    NSLog(@"Drawboard called"); 

    for (int j =0; j < 3; j++) { 
     for (int i = 0; i < 3; i++) { 
      CGRect frame = CGRectMake(tilex, tiley, hlineDistance-1, vlineDistance-1); 
      Tile* tile = [[Tile alloc] initWithFrame:frame]; 
      [self addSubview:tile]; 
      // ... 
      [self.gameDelegate addTile:tile]; 
     } 
     // ... 
    } 
    // ... 
} 
+0

這可能有助於http://stackoverflow.com/questions/6308425/ios-5-best-practice-release-retain – tipycalFlow 2012-02-26 17:15:37

回答

1

ARC在這裏不是問題。例如,超圖(self)保留的瓷磚,當您使用添加它們:

[self addSubview:tile]; 

驗證gameDelegate不是nil在該行:

[self.gameDelegate addTile:tile]; 

,它實際上增加瓷磚陣列。

+0

那麼gamecontroller有這個數組已經就像你說的那樣。問題出在一個新對象的每一個alloc上,prev版本是自動釋放的。 – 2012-02-26 17:20:44

+0

這不是一個問題,他們應該是autorelaeased。但作爲答案,他們也被視爲保留。 – 2012-02-26 17:29:08

+0

是的,我誤解了。出於某種原因,瓦片陣列是nill一下子源代碼:https://www.wetransfer.com/dl/8ek6eq1E/03595e523e0e0c8941f9c2c7d20d4ffe249e74b2d8c771e428a8efe596aaeed71b9cf9e42812b60 – 2012-02-26 17:34:56