【问题标题】:Autorelease issue with ARC (iOS)ARC (iOS) 的自动释放问题
【发布时间】:2012-03-16 08:17:36
【问题描述】:

我对 ARC 有一个小问题,我理解它为什么会这样做,但不知道如何防止它。此代码是示例“Tick tac toe”游戏的一部分。

问题是在一个名为Tile 的子类循环内分配一个新的UIView。设置完成后,我会将Tile(UIView)添加到当前视图,并将其添加到游戏控制器的磁贴数组中,以供参考。

现在的问题是,随着循环的每次迭代,图块对象都会自动释放,我希望它们被保留,以便我可以将它们存储在游戏控制器的图块容器中。如何让它记住瓷砖?

这是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];
        }
        // ...
    }
    // ...
}

【问题讨论】:

标签: ios memory-management automatic-ref-counting


【解决方案1】:

ARC 不是这里的问题。例如,超级视图 (self) 会在您使用以下方式添加图块时保留它们:

[self addSubview:tile];

验证gameDelegate 不是nil 在该行:

[self.gameDelegate addTile:tile];

它实际上将图块添加到数组中。

【讨论】:

  • 正如你所说,游戏控制器已经有了这个数组。问题出在新对象的每个分配上,上一个版本是自动发布的。
  • 这不是问题,它们应该是自动发布的。但它们也被视图保留为答案状态。
  • 是的,我看错了。由于某种原因,tile 数组突然变为 nill 源代码:wetransfer.com/dl/8ek6eq1E/…
  • 抱歉,我不能(也不想)下载代码。但是,我编辑了您的帖子以仅保留相关代码。你能把addTile的代码贴在GameDelegate吗?
  • 帖子已更新。新的下载位置也发布了我想添加 gameDelegate 是一个 IBOutlet。
猜你喜欢
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 2012-01-07
  • 2013-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多