ios添加一个对象作为子视图并重新启动给EXC_BAD_ACCESS异常,为什么?

时间:2012-07-26 06:02:52

标签: ios xcode debugging memory-management

我有一个简单的应用程序,我按编程方式添加UIButton,如下所示

    for(int i=0;i<[self.contentList count];i++)
    {
        UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [button addTarget:self action:@selector(buttonSelection:)forControlEvents:UIControlEventTouchDown];
        [button setTitle:[ [contentList objectAtIndex:i] valueForKey:@"nameKey"]  forState:UIControlStateNormal];
        button.tag=i+kButtonTagOffset;
        [self.view insertSubview:button atIndex:0];
       // [button release];

    }

然后在视图更改其方向时访问它,如下所示调整其位置

  for (int row = 0; row < Portrait_TILE_ROWS; ++row)
    {
        for (int col = 0; col < Portrait_TILE_COLUMNS; ++col)
        {
            int index = (row * Portrait_TILE_COLUMNS) + col;
            CGRect frame = CGRectMake(LandScape_TILE_MARGIN + col * (LandScape_TILE_MARGIN + LandScape_TILE_WIDTH),
                                      LandScape_TILE_MARGIN + row * (LandScape_TILE_MARGIN + LandScape_TILE_HEIGHT),
                                      LandScape_TILE_WIDTH, LandScape_TILE_HEIGHT);

            UIButton *tmb= (UIButton *)[self.view viewWithTag:index+kButtonTagOffset];
            if([tmb isKindOfClass:[UIButton class]]) //isKindOfClass
            {   
                [  [self.view viewWithTag:index+kButtonTagOffset] setFrame:frame];

            }

        }
    }

我的第一个问题是,为什么我在添加到子视图后释放UIBUtton时会出现EXC_BAD_ACCESS错误,它只发生在设备上而不是模拟器上。我想在添加到子视图时,对象的保留计数增加1以后访问它不会引起任何错误吗?

我如何能够在xcode调试器中弄清楚EXC_BAD_ACCESS异常的对象和位置  我想通过简单地评论部分代码来解决它!

由于 中号

1 个答案:

答案 0 :(得分:1)

您需要重读内存管理和可可命名约定的基础知识。你没有调用alloc,copy或retain ...因此释放它是不正确的。该构造函数返回自动释放的对象。如果您觉得这个概念很难,请切换到ARC。

至于确定错误在哪一行 - &gt; "Run > Stop on Objective-C exception" in Xcode 4?