0

我最近两次发生这种行为,我想知道问题的根本原因是什么(也就是我如何确保这种情况永远不会发生,所以我不必浪费大量时间来修复它)。

当我在计划重用的 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 变成僵尸)

是什么导致了这种行为?似乎测试 dataStorage 是否为零,然后才分配它与解决僵尸问题的方法相反。

-编辑-

如果这种行为是由共享变量引起的,我怎样才能使每次创建该对象的实例时都创建自己的数据存储对象?每个表都有自己的信息,不与其他表共享。

4

2 回答 2

2

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

现在,如果您的类的第二个实例已初始化并且您不检查

if (dataStorage == nil)

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

编辑:

如果每个对象都需要自己的dataStorage,您只需声明

SubHolder *dataStorage;

在您的interface声明中,或类似以下的属性:

@property (nonatomic, strong) SubHolder *dataStorage;
于 2012-06-28T19:16:18.130 回答
1

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

您应该像这样重复使用单元格:

UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"myCell"];
if(cell == nil) 
{
    cell = [[UITableViewCell alloc] initWithStyle:aStyle reuseIdentifier:@"myCell"];
}
于 2012-06-28T19:05:53.800 回答