2012-06-28 73 views
0

我最近有两次这种行为发生在我身上,我想知道问题的根源是什么(又如何确保这种情况永远不会发生,所以我不必浪费大量的时间修复它)。在UITableView ARC奇怪的释放行为

当我在一个预定要重用的tableview单元格中分配内容时,一旦另一个单元格被加载并且表格重新加载,有时该对象被释放。

例子:

SubHolder *dataStorage; 

- (void) initializeLicenseTable 
    { 
     LicenseCell *sampleLicense = [LicenseCell new]; 
     self.licenseData = [[NSMutableArray alloc] initWithObjects:sampleLicense, nil]; 
     nib = [UINib nibWithNibName:@"LicenseCell" bundle:nil]; 

    if (dataStorage == nil) 
    { 
     dataStorage = [SubHolder new]; 
     dataStorage.owner = self; 
     [dataStorage addStorageLocation]; 
    } 
} //cellForRowAtIndexPath and stuff 

这个代码不无if语句(它导致的数据存储成为僵尸)

是什么原因导致这种行为的工作?这似乎是测试dataStorage是否为零,只有然后分配它是什么应该修复僵尸问题的相反。

CNC中

如果这种行为是由变量共享造成的,我怎么可以把它使每个创建该对象的实例时它使自己的数据存储对象?每个表都有自己的信息,不与其他表共享。

+0

的数据存储一全局变量? – sergio

+0

它在文件的上下文中是'全局的'。 – Dustin

回答

2

由于dataStorage是一个全局变量(在类的文件范围内可见),它会被你的类的所有实例共享。

现在,如果你的类的第二个实例初始化,你不检查

if (dataStorage == nil) 

那么你的全局对象将被覆盖,因此在通过ARC释放一些点。如果某个其他对象在某处存储了它的值,它将尝试访问旧对象并获得僵尸访问权限。

编辑:

如果每个对象都需要自己dataStorage,你只需要简单地声明

SubHolder *dataStorage; 
interface声明

,或者像一个属性:

@property (nonatomic, strong) SubHolder *dataStorage; 
+0

有趣...所以即使我不把它称为静态,如果它是一个全局变量,那么类的每个实例都使用相同的内存位置? – Dustin

+0

好吧,我测试了它,这绝对是这种情况。我能做些什么来解决这个问题?每个类都应该有它自己的这个变量的实例。 – Dustin

+0

是的,这是一个全局变量; 'static'只意味着变量不能从不同的编译单元(私有全局类型)访问。 – sergio

1

看起来你只是一直在创建新单元而不是重复使用它们。

您应该重新使用的细胞是这样的:

UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"myCell"]; 
if(cell == nil) 
{ 
    cell = [[UITableViewCell alloc] initWithStyle:aStyle reuseIdentifier:@"myCell"]; 
} 
+0

我在我的cellForRowAtIndexPath方法中执行此操作。所示的方法用于初始化。 – Dustin