2012-02-26 13 views
-4

私はARCの問題を抱えています。なぜそれが何をするのか理解していないのですが、それを防ぐ方法はわかりません。このコードはサンプル "Tick tac toe"ゲームの一部です。ARC(iOS)の自動解放に関する問題

問題は、Tileという名前でサブクラス化されたループ内に新しいUIViewを割り当てることです。セットアップが完了したら、TileUIView)を現在のビューに追加し、後で参照用に使用するタイルのgamecontroller配列に追加します。

問題は、ループが繰り返されるたびにタイルオブジェクトが自動的に解放され、それらを保持して、それらをgamecontrolerのタイルコンテナに格納できるようにすることです。どのようにタイルを覚えているのですか?

これは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

答えて

1

ここでは問題ありません。あなたが使用してそれらを追加した場合たとえば、スーパービュー(self)は、タイルを保持:

[self.gameDelegate addTile:tile]; 

、それが実際にタイルを追加している:

[self addSubview:tile]; 

gameDelegateがラインでnilないことを確認します配列。

+0

よくgamecontrollerはあなたが言ったように、この配列を既に持っています。問題は、以前のバージョンがオートリリースされた新しいオブジェクトのすべての割り当てにあります。 –

+0

それは問題ではない、彼らはautorelaeasedされることになっています。しかし、彼らはまた、回答の状態としてビューに保持されます。 –

+0

はい、私はそれを誤解しました。何らかの理由でタイル配列が突然ソースコードになってしまいます。https://www.wetransfer.com/dl/8ek6eq1E/03595e523e0e0c8941f9c2c7d20d4ffe249e74b2d8c771e428a8efe596aaeed71b9cf9e42812b60 –

関連する問題