我有以下代码,仪器表明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发布于 2010-09-05 16:08:24
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发布于 2010-09-05 16:13:02
只是猜测,但是,如果您将newsListViewController从保留更改为分配,会发生什么?我几乎没有一起写retain,readonly。
https://stackoverflow.com/questions/3645364
复制相似问题