Iphone pushViewController内存泄漏

Iphone pushViewController内存泄漏,iphone,memory,memory-leaks,Iphone,Memory,Memory Leaks,我有以下代码,指示pushViewController方法在设备上有32字节的内存泄漏。你能帮我查一下我违反了什么规则吗?我是否应该为声明将某些“保留”更改为“分配”?提前谢谢 @interface GuideNewsViewController : UIViewController <UITableViewDataSource, UITableViewDelegate> { @private NSFetchedResultsController *fetchedResul

我有以下代码,指示pushViewController方法在设备上有32字节的内存泄漏。你能帮我查一下我违反了什么规则吗?我是否应该为声明将某些“保留”更改为“分配”?提前谢谢

@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
@界面指南NewsViewController:UIViewController{
@私人的
NSFetchedResultsController*fetchedResultsController;
NSManagedObjectContext*managedObjectContext;
UITableView*表格视图;
NewsListViewController*NewsListViewController;
}
@属性(非原子,保留)NSManagedObjectContext*managedObjectContext;
@属性(非原子、保留、只读)NSFetchedResultsController*fetchedResultsController;
@属性(非原子,保留)UITableView*tableView;
@属性(非原子、保留、只读)NewsListViewController*NewsListViewController;
@实现指南NewsViewController
......
-(void)tableView:(UITableView*)tableView未选择RowatineXpath:(NSIndexPath*)indexPath{
Member*Member=[fetchedResultsController对象索引路径:indexPath];
self.newsListViewController.managedObjectContext=self.managedObjectContext;
self.newsListViewController.title=member.memberName;
self.newsListViewController.author=成员;
**//漏在这里**
[self.navigationController pushViewController:self.newsListViewController动画:是];
}
......
@结束
@接口NewsListViewController:UIViewController{
@私人的
NSFetchedResultsController*fetchedResultsController;
NSManagedObjectContext*managedObjectContext;
UITableView*表格视图;
成员*作者;
}
@属性(非原子,赋值)NSManagedObjectContext*managedObjectContext;
@属性(非原子,保留)UITableView*tableView;
@属性(非原子、赋值、只读)NSFetchedResultsController*fetchedResultsController;
@属性(非原子,赋值)成员*作者;
@结束

self.newsListViewController何时发布?我不认为这一点会引起问题

通常,我会按以下方式推送ViewController

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必须通知self发生了什么事情,它可以使用委托通知self


编辑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
//MySelfViewController.h
@协议myself协议
-(无效)通知发生的事情;
@结束
@接口MySelfViewController:UIViewController{
身份证代表;
}
///客户端初始化childview通过传递self作为参数。
///内景控制器A,他打电话过来
///childView=[[MySelfViewController alloc]initWithDelegate:self];
-(id)initWithDelegate:(id)delegate;
///其他成员方法
@结束
//MySelfViewController.m
@实现MySelfViewController
-(id)initWithDelegate:(id)delegate
{
if(self=[super init])
{
///分配策略。
///子视图不应保留父视图或委托。
///可以让委托从不运行dealloc。
_代表=代表;
///自定义初始化
.... 
}
回归自我;
}
-有什么事发生了
{
[u代表通知发生的事情];
}
@结束

只是一个猜测,但是,如果您将newsListViewController从retain更改为assign,会发生什么情况?
我几乎不写保留,只读在一起。

我不认为这是错误的。因为newsListViewController是一个成员,所以应该在GuideNewsViewController的dealloc方法中释放它,如下所示:[newsListViewController释放];但是你有一个观点,没有必要让它成为一个成员,在这种情况下最好使用一个代表(如果必要的话)@nacho4d,Toro,谢谢你的回答。self.newsListViewController将以GuideNewsViewController的dealloc方法发布,将newsListViewController设置为GuideNewsViewController的属性的目的是重新使用它。因为我是iphone的新开发者。您能提供一些“使用委托通知自己”的示例代码吗?谢谢