2011-05-01 47 views
0

我有一个UITableView其中numberOfSectionsInTableView和numberOfRowsInSection被调用两次,第二次运行的范围问题。如果我掩盖了这个问题,我在第一次运行cellForRowAtIndexPath时遇到了一个范围问题。表视图数据源运行两次,作用域问题

大部分数据全部来自在viewDidLoad期间配置的NSDictionary。我也有一个NSArray在同一时间配置。一旦设定,它们不会被更改或释放。

当第一次调用numberOfSectionsInTableView时,没关系。根据需要计算元素等,然后立即调用第二次(不知道为什么)。在第二次运行时,它无法访问NSDictionary或NSArray项目。即使在尝试NSLog时也会崩溃。例如:

NSLog(@"theMainDictionary %@",theMainDictionary); 

通常会导致EXC_BAD_ADDRESS但有时这样的事情:

theMainDictionary <_UITableViewSeparatorView: 0x4e73680; frame = (0 307; 320 1); opaque = NO; autoresize = W; layer = <CALayer: 0x4e4bf20>> 

同样,这同一条线路运行正常(登录预期字典)第一次运行通过。

如果我通过返回一个固定的NSInteger来掩盖问题,numberOfRowsInSection然后做同样的事情。如果我屏蔽numberOfRowsInSection,cellForRowAtIndexPath在第一次运行时崩溃。虽然同样的问题 - 无法访问MainDictionary或相关的NSArray。

我不明白为什么他们运行两次 - 没有reloadData任何地方。我也不知道为什么第二个电话的运行方式不同。任何帮助非常感谢。

+0

你能展示整个.m文件的代码吗? – 2011-05-01 02:41:37

回答

0

您可能正在使用[NSDictionary dictionary]或几个类似的工厂方法之一(它会返回一个autoreleased实例)创建您的字典,然后直接将其保存到伊娃而不保留它。它会正常工作,直到你的程序回到主运行循环,此时autorelease将解析并释放对象。

有几种方法来解决这个问题:

  • 分配到财产申报retain,而不是伊娃。这意味着self.theMainDictionary而不仅仅是theMainDictionary。这将保留给你,所以它会坚持下去,直到你释放它(或分配一个不同的字典或nil属性)。
  • 使用[[NSDictionary alloc] init](或许多其他init方法之一)而不是[NSDictionary dictionary]样式。这会返回一个你拥有的实例,所以它会一直存在,直到你释放它为止。
  • 保存到ivar时,在字典上显式调用retain。这取决于所有权,所以它会坚持到你释放它为止。

在任何情况下,都要记得在您的dealloc方法中释放字典,否则内存将会泄漏。

以上所有可能也适用于该阵列。有关Cocoa中内存管理的更详细说明,请参阅Apple's documentation

+0

呃 - 不敢相信我错过了。它最初是一个财产,然后改为伊娃来换取别的东西。忘记这一步,我一直在寻找疯狂的原因。谢谢。 – 2011-05-01 03:26:15