2009-11-29 119 views
5

我有一个TableView建立并绘制好,但然后在滚动视图崩溃。我已经运行了调试器,看起来我的类级别的变量正在被覆盖,所以当再次调用titleForHeaderInSection时,它们不再存在。非常奇怪的是,如果我替换代码:UITableView在滚动崩溃

-(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; 
} 

它仍然崩溃,但这次调试器列表中没有一个NSString当你将鼠标悬停在sectionTitle变量。

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

- (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]; 
} 

我会绝对疯狂试图跟踪下来 - 了2天就可以了到目前为止,一切会对外感谢任何帮助。

问候

戴夫

+0

OK,如果我把在在的UITableView行它适用于约3或四次到底保留,然后控制台提供: *** - [UISwipeGestureRecognizer长]:无法识别的选择发送到实例0x43325d0 – 2009-11-29 08:30:13

+0

和还有: ***由于未捕获的异常“NSRangeException”而终止应用,原因:'*** - [NSCFArray objectAtIndex:]:index(0)beyond bounds(0)' – 2009-11-29 08:35:37

+0

好的,我会闭嘴的。我认为保留是我的红鲱鱼。这是因为我将titleForHeaderInSection替换为@“Test”,它已经工作了一段时间。控制台错误是: ***终止应用程序由于未捕获的异常'NSRangeException',原因:'*** - [NSCFArray objectAtIndex:]:索引(57744)超出界限(2)' – 2009-11-29 08:39:51

回答

12

OK,固定它...变化

favouritesDataSections = [favouritesDataAll allKeys]; 

要:

favouritesDataSections = [[favouritesDataAll allKeys] retain]; 

而这一切似乎工作。从这里我可以推断出,我用来存储节标题的数组指向的是在某个随机点自动释放的数据,这就是为什么它在看似奇怪的地方进行了测试。

虽然我确实承认自己仍然处于编码的“试错阶段”,并没有完全理解自己在做什么(我相信您会不约而同地阅读本文)。如果你有进一步阅读的任何想法/意见链接或关于这些工作如何工作的帖子(即何时和为什么使用保留等)以进一步理解,对我来说是有用的。再次

谢谢,戴夫

+0

Dave,请阅读Apple文档中的内存管理规则。如果你先做了一些阅读,这是一个基本的错误,你不会这么做。 – NSResponder 2009-11-29 15:38:29

+0

非常有用。我有类似的问题。谢谢!!!! – saimonx 2011-11-03 17:30:36

0

听起来像有某种内存损坏会在这里的。

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

如果你调整你的tableview只有一个部分会发生什么?

+0

您好格雷格,感谢您的快速回复。不幸的是,把超级放在最后导致它崩溃(即,TableView甚至没有绘制)。我也尝试手动设置节数为1,节的行数为1,节标题为@“测试”。仍然在滚动上崩溃。 – 2009-11-29 08:57:58

4

我会建议使用@property setters来避免这个问题,数组会被自动释放,所以你所谓的手动保留就可以了,这解决了这一问题,但一个简单的解决将是使用方法:

self.favoritesDataSection

这是通过自动@property(保留) 保留手段保留当该设定被调用,并且当它被设置为nil或不同的对象释放。