2010-07-24 60 views
0

我有一個UITableView與cellForRowAtIndexPath方法創建一個UITextView,然後將其添加到單元格。沒有檢測到內存泄漏,但是在運行儀器(對象分配)時,Net內存單向跳至18 MB,並在此處崩潰。內存增加從UITableView cellFromRowAtIndexPath

我的應用程序不斷添加和刪除tableView數據源中的單元格,但由於TextView被釋放,我看不出內存可能堆積。

這裏是我的cellForRowAtIndexPath代碼:

static NSString *[email protected]"Cell"; 
UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

if (cell==nil) { 
    // Build cell 
    cell=[[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:cellIdentifier] autorelease]; 
} 

cell.selectionStyle=UITableViewCellSelectionStyleNone; 

UITextView *tv=[[UITextView alloc] initWithFrame:CGRectMake(0, 0, 320, 95)]; 
tv.font=[UIFont fontWithName:@"Helvetica-Bold" size:16]; 

[email protected]"My Cell Text"; 

[cell addSubview:tv]; 
[tv release]; 

return cell; 

提前感謝!

+0

您可以使用Instruments的Leaks模板來調試這類事情。泄漏儀器將顯示仍然存在但不知道的物體; ObjectAlloc工具將顯示所有對象,所以您可以按類和實例向下鑽取,以查看可能存在的內容。 – 2010-07-24 16:32:23

回答

2

每次獲取單元格時都添加UITextView。如果它來自緩存,它已經有一個作爲一個子視圖,所以現在它有兩個人,然後是三個,然後是四個...

因此,只有將它們添加到細胞:

if (cell==nil) { 
    // Build cell 
    cell=[[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:cellIdentifier] autorelease]; 
    cell.selectionStyle=UITableViewCellSelectionStyleNone; 

    UITextView *tv=[[UITextView alloc] initWithFrame:CGRectMake(0, 0, 320, 95)]; 
    tv.font=[UIFont fontWithName:@"Helvetica-Bold" size:16]; 
    tv.tag = 42; // Or whatever, if you don't want to use custom cells 
    [cell addSubview:tv]; 
    [tv release]; 
} 

UITextView *textView = (UITextView *) [cell viewWithTag:42]; 
[email protected]"hi"; 
+0

謝謝,這很好,除非如果數據源更改如我的情況?單元格仍顯示緩存的數據? – pop850 2010-07-24 13:17:57

+0

它會顯示任何你設置文本,在這種情況下,「嗨」... 如果你需要不同的文本,這是設置它的地方 - 取決於indexPath。如果您需要在顯示時更改它,則需要重新加載給定的indexPath,即[self.tableView reloadRowsAtIndexPaths:... withAnimation:...]; – Eiko 2010-07-24 13:23:16