2010-08-02 68 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