2010-08-02 45 views
0

我知道在很多情况下我不必释放静态变量。然而,以下是我的模型代码:发布静态对象

+ (UIImage*)imageForTag 
{ 
    static UIImage *imgTag; 

    if(imgTag == nil) 
    { 
     NSString* imageName = [[NSBundle mainBundle] 
          pathForResource:@"tag" ofType:@"png"]; 
     imgTag = [[[UIImage alloc] 
          initWithContentsOfFile:imageName] autorelease]; 
    } 
    return imgTag; 
} 

,这里是我的数据表部分

- (UITableViewCell *)tableView:(UITableView *)tableView 
        cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView 
        dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc] 
           initWithStyle:UITableViewCellStyleDefault 
           reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    if (indexPath.row == 0) 
    { 
     cell.imageView.image = [DataModel imageForSmtng]; 
    } 
    else if(indexPath.row == 1) 
    { 
     cell.imageView.image = [DataModel imageForTag]; 
    } 

    return cell; 

这将在cell.imageView.image = [DataModel imageForTag]秒崩溃时由于imageForTag指向无效的地址。如果我添加保留它不会崩溃。从上面删除autorelease并忘记​​引用是错误的吗?

+0

你知道'autorelease'会在将来某个时候向你的对象发送一个'release'消息吗?这是你想要的吗? – zneak 2010-08-02 05:47:47

+0

是的,但我一直在想,一旦我赋予细胞所有权,它将保留并保留。我想在某些时候细胞正在放弃所有权... – Pablo 2010-08-02 06:02:44

回答

1

这是错误的。因为当你在imgTag变量上调用autorelease时,你刚刚释放了它指向的对象。但是,imgTag变量仍指向该范围的内存。所以,当你再次调用imgTag时,它不是零,它仍然指向某个东西,是一个无效的东西。

因此,解决方案应该是:

1 /你不应该在所有

2释放它/你必须手动释放它,当你认为这是一个很好的时间来释放它。然后记得这样做:imgTag = nil

+0

但是我只知道dealloc的美好时光。对于其余的我只是给标准单元所有权,我不在乎。原来这个单元格也是释放它:(我想我不会在上述方法中自动释放它,并在应用程序终止时释放它,因为我一直需要它。 – Pablo 2010-08-02 06:05:51

+0

是的,如果你一直需要它,你根本不应该释放它,当你将它设置到单元格时,单元格会保留它,但在单元格出去后它也会释放它,所以静态imgTag仍然存在,你不需要担心 – vodkhang 2010-08-02 06:40:59