ios ARC表访问不良

时间:2012-05-29 18:04:29

标签: ios uitableview memory-management automatic-ref-counting exc-bad-access

对于我的表格视图我有以下内容(转述)

的.h

@interface OptionsView : UIView <UITableViewDelegate, UITableViewDataSource>

@property (nonatomic, retain) NSArray *dataSource;

的.m

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {

        ...

        self.dataSource = [NSArray arrayWithObjects:options, sections, sponsor,  nil];
    }
    return self;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(self.dataSource) {
        NSArray *ds = [self.dataSource objectAtIndex:indexPath.section];
        NSDictionary *d = [ds objectAtIndex:indexPath.row];
        ActionBlock a = [d objectForKey:ACTION]; // <-- Thread 1: EXC_BAD_ACCESS (code=2, address=0x802)
        if(a != nil) a();
    }
}

你可以在didSelectRowAtIndexPath我看到EXC_BAD_ACCESS,但我不确定原因。因为我正在使用弧线,所以它不是僵尸问题(已经检查过)。

使用断点我看到self.dataSource在初始化后存在,但不是在需要时。它也不会显示为<nil>,它只是空格。此外,这适用于调试,但不适用于发布,那是什么意思?

**编辑添加截图**

你会注意到dsd都没出现..奇怪? xcode debug

2 个答案:

答案 0 :(得分:2)

所以我可以看到两个可能导致问题的地方。首先,ACTION是什么?它是某种NSString吗?只是想确保您使用的是有效的密钥对象。其次,(更有可能是问题),看起来ActionBlock是你存储在集合数组中的某种代码块。您是否在将该块存储在数组/字典中之前复制该块?您必须复制任何想要保留(存储)的块,而不是创建它的范围。这很容易做到。例如:

void (^NewBlock)(void) = [^{
    ....code....
} copy];

可替换地:

void (^NewBlock)(void) = ^{
    ....code....
};

[dictionary setObject:[NewBlock copy] forKey:ACTION]; //Assuming #define ACTION @"action"

将其复制到堆上以便存储。如果你不复制它,你会在你尝试引用创建范围之外的块时获得BAD_EXC_ACCESS。

答案 1 :(得分:0)

看起来你正在使用UIViewController而不是UITableViewController。如果我没记错的话,你必须转到检查器并将委托和数据源从tableView拖到UIViewController。我不记得确切,我不在我的电脑上,但我确定在我开始为每个tableView使用UITableViewController之前已经做了好几次。

哦,我不会使用dataSource作为你的数组的名称。只是为了防止命名冲突。