Проблема с автоматическим выпуском с ARC (iOS) - PullRequest
0 голосов
/ 26 февраля 2012

У меня есть небольшая проблема с ARC, и я понимаю, почему она делает то, что делает, но не как ее предотвратить. Этот код является частью образца игры "Tick Tac Toe".

Проблема заключается в выделении нового UIView внутри цикла, подкласса которого называется Tile. После настройки я добавлю Tile (UIView) к текущему представлению и добавлю его в массив плиток gamecontroller, который позже будет использоваться для справки.

Теперь проблема в том, что при каждой итерации цикла объекты-плитки автоматически освобождаются, и я хочу, чтобы они сохранялись, чтобы я мог сохранить их в контейнере плиток игрового контроллера. Как мне заставить его вспомнить плитки?

Это код в игре Delegate:

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

Вывод последнего добавления здесь:

Размещено на pastebin.com для лучшего форматирования

В этот момент, как и ожидалось, будет выведен весь локальный массив плиток внутри игрового контроллера, и это как и ожидалось; есть список с объектами Tile.

Новая ссылка для скачивания

Это код в 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];
        }
        // ...
    }
    // ...
}

1 Ответ

1 голос
/ 26 февраля 2012

ARC здесь не проблема. Например, суперпредставление (self) сохраняет плитки, когда вы добавляете их, используя:

[self addSubview:tile];

Убедитесь, что gameDelegate не nil в строке:

[self.gameDelegate addTile:tile];

и что он на самом деле добавляет плитки в массив.

...