UITableView在滚动时崩溃

时间:2009-11-29 08:07:52

标签: objective-c iphone uitableview

我有一个构建和绘制确定的TableView,但在滚动视图时崩溃。我已经浏览了调试器,似乎我的类级变量被某种方式覆盖,因此当再次调用titleForHeaderInSection时它们不再存在。非常奇怪的是,如果我替换代码:

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
NSString *sectionTitle = [favouritesDataSections objectAtIndex:section];
return sectionTitle;
}

使用:

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
NSString *sectionTitle = @"Test";
return sectionTitle;
}

它仍然崩溃但是这次当你将鼠标悬停在sectionTitle变量上时,调试器不会列出NSString。

这是我用来创建视图和设置类级别变量的代码:

- (void)loadView {
[super loadView];
CGRect tableSize = CGRectMake(0,0,320,460);
UITableView *favouritesTableView = [[UITableView alloc] initWithFrame:tableSize style:UITableViewStylePlain];
favouritesTableView.autoresizingMask = (UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight);
favouritesTableView.dataSource = self;
favouritesTableView.delegate = self;
favouritesTableView.rowHeight = 52;
[self.view addSubview:favouritesTableView];
}

- (void)viewDidLoad {
[super viewDidLoad];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
// Get the full path of the favourites plist
NSString *filename = [documentsDirectory stringByAppendingPathComponent:@"Favourites.plist"];
// Initialise Dictionary and array
favouritesDataAll = [[NSMutableDictionary alloc] init];
favouritesDataSections = [[NSArray alloc] init];

NSDictionary *dict = [[[NSMutableDictionary alloc] initWithContentsOfFile:filename] retain];
favouritesDataAll = dict;
[dict release];

favouritesDataSections = [favouritesDataAll allKeys];   
}

我绝对会疯狂地试图追踪这一点 - 到目前为止花了两天时间,所以在外面感激任何帮助。

祝你好运

戴夫

3 个答案:

答案 0 :(得分:12)

好的,修好了......改了

favouritesDataSections = [favouritesDataAll allKeys];

要:

favouritesDataSections = [[favouritesDataAll allKeys] retain];

这一切似乎都有效。从这里我可以推断出我用来存储章节标题的数组指的是在某个随机点自动释放的数据,这就是为什么它在看似奇怪的地方进行扒窃的原因。

我承认,虽然我仍然处于编码的“试错”阶段,并且不完全理解我在做什么(我相信你会读到这个)。如果您对进一步阅读或有关所有这些工作如何起作用的任何想法/评论链接(即何时以及为何使用保留等)以促进我的理解,那将对我有用。

再次感谢,戴夫

答案 1 :(得分:4)

我建议使用@property setter来避免这个问题,数组是自动释放的,所以你调用了一个手动保留,这解决了问题,但更简单的修复就是使用:

self.favoritesDataSection

@property(保留)自动执行此操作 保留意味着保留在设置时调用,并在设置为nil或不同对象时释放。

答案 2 :(得分:0)

听起来这里有某种内存腐败现象。

我看到的一件事是那些对[super ...]的调用应该在这些方法中的其他代码之后发生。

如果您将tableview调整为只有一个部分,会发生什么?