0

我是 Objective C 和 iOS 的新手,我在使用 iPad mini 时遇到内存问题,

我使用基于 nag 的应用程序,当我想UIVIewController在我使用的堆栈上推送 a 时:

MyUIViewController *aController = [MyUIViewController alloc] initWithNibName:@"MyUIViewController" bundle:nil];

当我使用新的 XCode 5 内存调试导航器并在堆栈上推送一个新控制器时,我看到内存在增长,然后当我使用:

[self.navigationController popViewControllerAnimated:YES];

我假设使用 ARC 控制器被释放,但内存永远不会下降。当我解雇一个PopController.

我不明白,有没有办法在内存中释放这个控制器,这样我的应用程序就可以完美运行了?

我知道当我收到内存警告时,我必须释放屏幕上没有的东西,但在这种情况下,我被卡住了,因为我需要的一切都在屏幕上......

4

3 回答 3

1

因此,在 Instruments 中,您有几个工具可以帮助诊断您的问题。您可以使用 Memory Leak 工具查看您的视图控制器是否真的在泄漏内存,您也可以使用 Memory Allocation 工具创建堆快照来查看是否存在废弃内存的问题。这是一个关于使用 Instruments 进行调试的好教程。

于 2013-10-16T14:25:38.857 回答
0

您尚未提供源代码,但在遇到此问题时,我有一些建议:

首先,在要弹出的对象上实现该-(void)dealloc方法,UIViewController并在执行实际弹出时查看它是否被调用(在其中放置断点)。如果不是,发生的事情是它UIViewController被其他对象保留。

使用静态分析器检查它是否在您的代码中发现问题:

分析!

还要确保您没有遇到保留周期。

对于块:

块将所有对象保留在其范围内,除非您明确告诉它们不要这样做。如果您的对象也保留此块,您将进入保留周期。为了防止这种情况,您通常希望创建一个指向 self 的弱指针。

- (void)someMethod
{
    _weak id weakSelf = self;
    self.block = ^{
        [weakSelf doSomething];  // retain cycle free!
    };
}

对于组成:

如果您有一个对象保留另一个对象,而另一个对象又保留第一个对象,您也会遇到一个保留周期。例如:

@interface ObjectA : NSObject

@property (strong, nonatomic) ObjectB *objectB;

@end

@implementation

- (id)init
{
    self = [super init];
    if (self) {
        self.objectB = [[ObjectB alloc] initWithObjectA:self]; // self.objectB gets retained
    }

    return self;
}

@end

@interface ObjectB : NSObject

@property (strong, nonatomic) ObjectA *objectA; // the strong directive will cause a retain cycle, this should be weak

- (id)initWithAnObjectA:(ObjectA *)objectA;

@end

@implementation ObjectB

- (id)initWithAnObjectA:(ObjectA *)objectA;
{
    self = [super init];
    if (self) {
        self.objectA = objectA; // self.objectA gets retained, leading to a retain cycle
    }

    return self;
}

@end
于 2013-10-16T14:14:00.943 回答
-1

将其添加到导航层次结构时使用自动释放视图控制器

MyUIViewController *aController = [[MyUIViewController alloc] initWithNibName:@"MyUIViewController" bundle:nil] autorelease];
[self.navigationController pushViewController:aController animated:YES];
于 2013-10-16T14:02:59.953 回答