ios - UIViewController 已正确释放,但其 UIView 未正确释放?

标签 ios objective-c memory uiviewcontroller abandoned-memory

我正在使用 Apple 的 Instruments “分配”工具,并注意到当我在两个 View 之间来回切换时,分配总是会增长。调查,我发现所有的内存都来自我的 UIViewController 的 UIView 的 subview 的对象。

我检查了,我的 UIViewController 正在被释放,但显然 UIView 不是?我没有将 UIView 与 UIView Controller 分开保留。有人有想法么?

这是我编写的用于在 View 之间切换的代码。

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

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

有什么新想法吗?

最佳答案

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

您正在做的是不断覆盖 self.currentViewController ivar 而不释放它。您可能正在释放该 View Controller 拥有的 View ,但仅此而已。

currentViewController 是否定义为

@property (nonatomic, retain) UISubViewController* currentViewController;

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

关于ios - UIViewController 已正确释放,但其 UIView 未正确释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4139005/

相关文章:

ios - 意外的类型名称“BOOL”:iOS SDK 6.1(设备)中的预期表达式

ios - TableViewCells 数组在更新 TableView 后重新排序

ios - 如何从辅助类添加 View

ios - estimatedHeightForRowAtIndexPath 和 heightForRowAtIndexPath 之间的区别?

mysql - MySQL 在执行 "select"时如何使用内存?

ios - 在 Xcode 7 UI 测试中访问嵌套的 UIElement

ios - 当 mapView 执行时,请求用户允许使用 iOS 访问他们的位置

ios - -[NSDateFormatter dateFromString :] returns nil

c++ - 重新分配(): invalid old size even when malloc() is used to allocate memory

c++ - 已删除的类实例上的方法仍然有效吗?