2010-09-05 34 views
1

我有以下代碼,儀器表明pushViewController方法在設備上有32個字節的內存泄漏。請你幫忙檢查一下我打破了什麼規則?我是否應該將某些「保留」更改爲「分配」以進行申報?提前致謝!pushViewController內存泄漏

@interface GuideNewsViewController : UIViewController <UITableViewDataSource, UITableViewDelegate> { 

@private 
    NSFetchedResultsController *fetchedResultsController; 
    NSManagedObjectContext *managedObjectContext; 
    UITableView *tableView; 
    NewsListViewController *newsListViewController; 
} 

@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext; 
@property (nonatomic, retain, readonly) NSFetchedResultsController *fetchedResultsController; 
@property (nonatomic, retain) UITableView *tableView; 
@property (nonatomic, retain, readonly) NewsListViewController *newsListViewController; 



@implementation GuideNewsViewController 
...... 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    Member *member = [fetchedResultsController objectAtIndexPath:indexPath]; 
    self.newsListViewController.managedObjectContext = self.managedObjectContext; 
    self.newsListViewController.title = member.memberName; 
    self.newsListViewController.author = member; 
    **// leak here** 
    [self.navigationController pushViewController:self.newsListViewController animated:YES]; 
} 
...... 
@end 


@interface NewsListViewController : UIViewController <UITableViewDataSource, UITableViewDelegate> { 

@private 
    NSFetchedResultsController *fetchedResultsController; 
    NSManagedObjectContext *managedObjectContext; 
    UITableView *tableView; 
    Member *author; 
} 

@property (nonatomic, assign) NSManagedObjectContext *managedObjectContext; 
@property (nonatomic, retain) UITableView *tableView; 
@property (nonatomic, assign, readonly) NSFetchedResultsController *fetchedResultsController; 
@property (nonatomic, assign) Member *author; 

@end 

回答

0

什麼時候發佈self.newsListViewController?我不認爲這一點會導致問題。

一般來說,我用下面的方式pushViewController。

MySelfViewController *childView = [[MySelfViewController alloc] init]; 

// set up necessary properties of childView 
... 

// navigationController will release childView when it pops view controller. 
[self pushViewController:childView animated:YES]; 

// release childView after pushViewController 
[childView release]; 

如果childView必須通知自己發生了什麼事情,它可以使用委託來通知自己。


編輯1:

一個例子是如下。

// MySelfViewController.h 
@protocol MySelfProtocol <NSObject> 
- (void)notifySomethingHappened; 
@end 

@interface MySelfViewController : UIViewController { 
    id <MySelfProtocol> _delegate; 
} 

/// client init childview by pass self as parameter. 
/// ex: Inside view controller A, he calls by 
/// childView = [[MySelfViewController alloc] initWithDelegate:self]; 
- (id)initWithDelegate:(id)delegate; 

/// other member methods 
@end 

// MySelfViewController.m 
@implement MySelfViewController 
- (id)initWithDelegate:(id)delegate 
{ 
    if (self = [super init]) 
    { 
     /// assign policy. 
     /// childView should not retain parent view or delegate. 
     /// It is possible to let delegate never run dealloc. 
     _delegate = delegate; 

     /// custom initialization 
     .... 

    } 
    return self; 
} 

- (void)someThingHappen 
{ 
    [_delegate notifySomethingHappend]; 
} 
@end 
+0

我不認爲這是不正確的。因爲newsListViewController是一個成員,所以它應該從GuideNewsViewController的dealloc方法中釋放,如下所示:[newsListViewController release]; 但你有一點,沒有必要使它成爲會員,在這種情況下最好使用委託(如有必要) – nacho4d 2010-09-05 08:14:37

+0

@ nacho4d,託羅,謝謝你的回覆。 self.newsListViewController將在GuideNewsViewController的dealloc方法中發佈,設置newsListViewController的目的爲GuideNewsViewController的屬性重新使用它。 因爲我是iphone的新開發者。您能否提供一些「使用委託通知自己」的示例代碼?謝謝。 – mobguang 2010-09-05 08:54:38

+0

我會試試看。謝謝大家! – mobguang 2010-09-05 16:55:08

0

只是猜測,但是,如果你改變你的newsListViewController從保留分配會發生什麼? 我幾乎沒有寫保留,只讀一起。