2010-09-05 62 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从保留分配会发生什么? 我几乎没有写保留,只读一起。