iPad Mini上的iOS内存管理

时间:2013-10-16 13:55:25

标签: ios memory-management

我是目标C和iOS的新手我使用iPad mini面临内存问题,

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

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

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

[self.navigationController popViewControllerAnimated:YES];

我假设使用ARC控制器被释放,但内存永远不会下降。当我解雇PopController时也是如此。

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

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

3 个答案:

答案 0 :(得分:1)

因此,您需要使用一些工具来帮助诊断问题,而这些工具都在仪器中。您可以使用“内存泄漏”工具查看视图控制器是否实际泄漏内存,还可以使用“内存分配”工具创建快照,以查看是否存在丢弃内存问题。 Here is a good tutorial about using Instruments for debugging.

答案 1 :(得分:0)

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

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

使用静态分析器检查代码中是否存在问题:

Analyze!

还要确保您没有进入保留周期。

对于块:

块保留其范围内的所有对象,除非您明确告诉他们不要这样做。如果您的对象也保留此块,您将进入保留周期。为了防止这种情况,通常需要创建一个指向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

答案 2 :(得分:-1)

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

MyUIViewController *aController = [[MyUIViewController alloc] initWithNibName:@"MyUIViewController" bundle:nil] autorelease];
[self.navigationController pushViewController:aController animated:YES];