UIViewController被正确释放,但它的UIView不是?

时间:2010-11-09 21:48:13

标签: ios objective-c memory uiviewcontroller abandoned-memory

我正在使用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

每次换入和换出新视图时,我仍然会看到视图的内存泄漏。

有任何新想法吗?

2 个答案:

答案 0 :(得分:0)

您的工厂返回一个viewController,但您只是添加一个视图,而不是推送一个新的控制器。为什么不在这种情况下创建视图?

你正在做的是不断地覆盖self.currentViewController ivar而不释放它。您可能正在释放该视图控制器拥有的视图,但这就是全部。

currentViewController是否定义为

@property (nonatomic, retain) UISubViewController* currentViewController;

也许?如果是这样,有一个与发行版不匹配的保留 - 你永远不会在覆盖它之前释放self.currentViewController。如果您没有使用self.,即使属性如此定义,它也不会保留。

答案 1 :(得分:0)

您正在删除旧视图并添加新视图。这意味着您在SubViewController中的某个位置错误地保留了视图,或者您正在模拟器而不是设备中进行测试。

你可以发布SubViewController的代码,看看那里发生了什么吗?

当您在真实设备上进行测试时,您会得到相同的结果吗?


PS Adam Adam Eberbach提出了一个公平的观点 - 你为什么要创建一个视图控制器只是为了窃取它的视图然后释放它?