2013-05-08 68 views
0

我有UITableViewCell在我的應用程序:的UITableViewCell dealloc方法

@interface ResultCell : UITableViewCell { 
IBOutlet UILabel *name; 
IBOutlet UILabel *views; 
IBOutlet UILabel *time; 
IBOutlet UILabel *rating; 
IBOutlet UILabel *artist; 

IBOutlet UIImageView *img; 
} 

@property (nonatomic, retain) UILabel *name; 
@property (nonatomic, retain) UILabel *views; 
@property (nonatomic, retain) UILabel *time; 
@property (nonatomic, retain) UILabel *rating; 
@property (nonatomic, retain) UILabel *artist; 

@property (nonatomic, retain) UIImageView *img; 

@end 

而這一切IBOutlet連接在XIB文件UILabel ....

的我這是怎麼創建的每個細胞:

static NSString *CellIdentifier = @"ResultCell"; 
ResultCell *cell = (ResultCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

if (cell == nil){ 
    UIViewController *vc = [[[UIViewController alloc] initWithNibName:@"ResultCell" bundle:nil] autorelease]; 
     cell = (ResultCell *) vc.view; 
} 

cell.name.text = item.name; 
cell.views.text = item.viewCount; 
cell.rating.text = [NSString stringWithFormat:@"%d%%",item.rating]; 
cell.time.text = item.timeStr; 
cell.artist.text = item.artist; 

我想知道如果在ResultCell類中我需要實現dealoc方法並釋放UILabel?或者像我所做的那樣好嗎?我正在使用非ARC,因爲它是一箇舊項目。

+0

你爲什麼要創建e UIViewController,然後取出單元格而不是單元格?你的vc.view似乎是一個UIView,而不是一個單元格。 – 2013-05-08 09:03:40

+0

在這種情況下,是的,你需要。然而,所有這些保留屬性似乎毫無意義,因爲無論如何,它們都將被他們的超級視圖所保留。爲什麼不把它們全部改爲'assign'?那麼你將不必處理'dealloc'。 – borrrden 2013-05-08 09:04:44

+0

爲什麼你需要一個UIViewController for ResultCell類? – 2013-05-08 09:05:24

回答

0

你可以讓所有標籤在定製表viewcell的分配,如果你需要它保留它,你必須在dealloc方法來釋放和viewDidUnload分配爲零。它避免了內存泄漏。

-1

使用的東西,喜歡 -

ResultCell *containerView = [[[NSBundle mainBundle] loadNibNamed:@"ResultCell" owner:self options:nil] lastObject]; 

,而不是

UIViewController *vc = [[[UIViewController alloc] initWithNibName:@"ResultCell" bundle:nil] autorelease]; 

確保ü使ResultCell.xib文件的所有者ResultCell類。

而且,作爲UILabelUIImageViewretained性質,他們要在ResultCell類的dealloc方法來釋放。

+0

爲什麼F ***是-1? – 2013-05-28 09:41:01

1

是的,每個保留的屬性或實例變量都必須被釋放,而IBOutlets沒有區別。由於您使用性能,優選的方式做到這一點是:

-(void)dealloc { 
    self.name = nil; 
    self.views = nil; 
    //... and so on 
    [super dealloc]; 
} 

順便說一句,你不需要申報「冗餘」的實例變量,你的屬性是這樣的:

IBOutlet UILabel *name; 

它很久以前需要(AFAIR在XCode 3時代),但現在編譯器會自動爲每個聲明的屬性生成它們。

+1

+1,但只是我讀到的一個小問題:不要在'dealloc'中使用'self.XXX = nil',而只是釋放支持屬性。這將避免任何潛在的KVO問題(儘可能避免'init'和'dealloc'中的'self') – borrrden 2013-05-08 09:28:21

+0

鏈接到以上信息 - > http://stackoverflow.com/questions/3402234/properties- in-dealloc-release-then-set-to-nil-or-simply-release#comment3539445_3402247 – borrrden 2013-05-08 09:30:44

+0

IBOutlets被視圖所佔據並且可能很弱 - 除頂層對象外 – 2013-05-08 09:38:36

0
  1. 您是類型轉換UIViewResultCell,而不是創建UITableViewCell實例與小區標識。
  2. dequeueReusableCellWithIdentifier:總是會返回nil,從而創造大量UIViewController情況
  3. 的因爲你是返回UIViewController的視圖,存儲管理將成爲非常棘手。您還需要在表格視圖釋放單元格後釋放視圖控制器實例。這將需要存儲所有的vc實例並在以後發佈。目前所有的vc實例都導致內存泄漏。

爲了避免這些不必要的複雜情況,您需要遵循標準技術。話雖如此,你需要爲單元格創建一個單獨的XIB和類文件,使用UINib從xib加載表格視圖單元格。請參閱tutorial

乾杯!
Amar

相關問題