2012-02-27 58 views
1

我運行了分配器和內存泄漏選項的分析器。 我發現與表格單元格相關的對象永遠不會被釋放。 通過進一步分析,我發現問題是由我在單元中存儲的自定義圖像引起的。 我更好地解釋:object-c中的對象分配/釋放不正確

我有擴展表格單元的對象:在.M類文件,並沒有別的只是簡單的@synthesize

@interface IP2TableViewCell : UITableViewCell 

@property(nonatomic,weak) IBOutlet UIImageView *background; 
@property(nonatomic,weak) IBOutlet UIImageView *thumbnail; 
@property(nonatomic,weak) IBOutlet UILabel *cellTitle; 
@property(nonatomic,weak) IBOutlet UILabel *cellDescr; 

@end 

然後我做了一個擴展UIImage的類,它有我使用的這個相關的initMethod。 我不得不說,自我= [超..]是一段代碼我不明白,我從視圖控制器的自動生成的代碼,這是如果(自己= [超級initWith ...)

-(ExtendedImage*)initWithPath:(NSString*)path andOptions:(NSDictionary*)opt { 
    self=[super initWithContensOfFile:path]; 
    self.options=opt; 
    return self; 
} 

這是分配問題開始顯示的地方。 我有一個工廠,通過調用上面的init方法來構建圖像,然後將圖像添加到單元格中。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSDictionary *obj = [fetchedResultsController objectAtIndexPath:indexPath]; 
    IP2TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"tableCell"]; 
    cell.cellTitle.text=[obj objectForKey:@"cellTitle"]; 
    NSDictionary *options = [NSDictionary dictionaryWithObject:indexPath forKey:@"indexPath"]; 
    ExtendedImage *ei = [imageCache imageWithPath:@"/path/to/file" withOptions:options]; 
    cell.thumbnail.image=ei; 
    return cell; 
} 

在探查它表明ExtendedImage長生不老,並永遠不會被釋放,並表的單元格就不會釋放。 如果在其他情況下,我做

cell.thumbnail.image=[UIImage imageWithContentsOfFile:@"/path/to/file"]; 

一切都表現很好,並且探查沒有顯示什麼特別錯了,和對象,細胞,得到正確釋放。

在這一點上,我有兩個簡單的問題。

  • 爲什麼這不顯示爲泄漏?我的意思是,使用泄漏選項進行分析並不會將其顯示爲泄漏
  • 我在做自定義映像時出錯了什麼?

感謝

+0

如果沒有'ExtendedImage'代碼,沒辦法回答。 – 2012-02-27 10:24:58

+0

ExtendedImage只有這個initMethod和一個@property(強)的選項,剩下的只是擴展UIImage。希望這對你來說已經足夠了。 – Leonardo 2012-02-27 13:45:28

回答

1

你有一個imageCache:這表明你實際上是試圖緩存圖像。按照定義,這將會導致它們在不使用它們時掛在身邊。你需要考慮你的緩存策略:你真的需要緩存圖像嗎?如果是這樣,需要多久?什麼時候可以清空緩存中的圖像?

您可以考慮爲緩存使用可清除的內存(與NSCache集成),以便操作系統可以管理你的圖像,當它們阻擋時。