对于我的表格视图我有以下内容(转述)
@interface OptionsView : UIView <UITableViewDelegate, UITableViewDataSource>
@property (nonatomic, retain) NSArray *dataSource;
- (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>
,它只是空格。此外,这适用于调试,但不适用于发布,那是什么意思?
**编辑添加截图**
你会注意到ds
或d
都没出现..奇怪?
答案 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作为你的数组的名称。只是为了防止命名冲突。