我正在使用Apple的仪器“Allocations”工具,并注意到当我在两个视图之间来回切换时,分配总是会增加。调查一下,我发现所有内存都是来自UIViewController的UIView子视图的对象。
我检查过并且我的UIViewController被释放了,但显然UIView不是吗?我没有从UIView控制器中保留UIView。有人有什么想法吗?
这是我在视图之间切换的代码。
UISubViewController *viewController = [UIViewControllerFactory createViewController:viewControllerID]; // Creates and returns a UIViewController by ID
[currentViewController viewWillDisappear:YES];
[currentViewController.view removeFromSuperview];
[currentViewController viewDidDisappear:YES];
[viewController viewWillAppear:YES];
[self.view insertSubview:viewController.view atIndex:0];
[viewController viewDidAppear:YES];
self.currentViewController = viewController;
[viewController release];
修改
好吧,因为有人担心我只是使用ViewController的View然后发布了ViewController,我尝试了一个实验,我在NIB中创建了一个新的类,它是文件的所有者,但是继承自NSObject。
代码现在看起来像这样:
MyView *myView = [[MyView alloc] initWithNibName:@"myView"];
[currentView viewWillDisappear:YES];
[currentView.view removeFromSuperview];
[currentView viewDidDisappear:YES];
[myView viewWillAppear:YES];
[self.view insertSubview:myView.view atIndex:0];
[myView viewDidAppear:YES];
self.currentView = myView;
[myView release];
MyView的初始化程序如下:
@interface MyView : NSObject {
IBOutlet UIView *view;
NSArray *nibTopLevelObjects;
}
@property (nonatomic, retain) UIView *view;
- (id)initWithNibName:(NSString *)nibName;
@end
@implementation MyView
@synthesize view;
- (id)initWithNibName:(NSString *)nibName {
if (self = [super init]) {
nibTopLevelObjects = [[NSBundle mainBundle] loadNibNamed:nibName owner:self options:nil];
[nibTopLevelObjects retain];
}
return self;
}
- (void)dealloc {
[view release];
[nibTopLevelObjects release];
view = nil;
nibTopLevelObjects = nil;
[super dealloc];
}
@end
每次换入和换出新视图时,我仍然会看到视图的内存泄漏。
有任何新想法吗?
答案 0 :(得分:0)
您的工厂返回一个viewController,但您只是添加一个视图,而不是推送一个新的控制器。为什么不在这种情况下创建视图?
你正在做的是不断地覆盖self.currentViewController ivar而不释放它。您可能正在释放该视图控制器拥有的视图,但这就是全部。
currentViewController是否定义为
@property (nonatomic, retain) UISubViewController* currentViewController;
也许?如果是这样,有一个与发行版不匹配的保留 - 你永远不会在覆盖它之前释放self.currentViewController。如果您没有使用self.
,即使属性如此定义,它也不会保留。
答案 1 :(得分:0)
您正在删除旧视图并添加新视图。这意味着您在SubViewController中的某个位置错误地保留了视图,或者您正在模拟器而不是设备中进行测试。
你可以发布SubViewController的代码,看看那里发生了什么吗?
当您在真实设备上进行测试时,您会得到相同的结果吗?