首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pushViewController内存泄漏

pushViewController内存泄漏
EN

Stack Overflow用户
提问于 2010-09-05 15:47:52
回答 2查看 1.2K关注 0票数 1

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

代码语言:javascript
复制
@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
EN

回答 2

Stack Overflow用户

发布于 2010-09-05 16:08:24

self.newsListViewController什么时候发布?我不认为这一点会带来问题。

一般情况下,我pushViewController的方式如下。

代码语言:javascript
复制
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:

下面是一个示例。

代码语言:javascript
复制
// 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
EN

Stack Overflow用户

发布于 2010-09-05 16:13:02

只是猜测,但是,如果您将newsListViewController从保留更改为分配,会发生什么?我几乎没有一起写retain,readonly。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3645364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档