我是目标C和iOS的新手我使用iPad mini面临内存问题,
我使用基于nag的应用程序,当我想在我使用的堆栈上推送UIVIewController
时:
MyUIViewController *aController = [MyUIViewController alloc] initWithNibName:@"MyUIViewController" bundle:nil];
当我使用新的XCode 5内存调试导航器并且我在堆栈上推新控制器时,我看到内存在增长,然后当我使用时:
[self.navigationController popViewControllerAnimated:YES];
我假设使用ARC控制器被释放,但内存永远不会下降。当我解雇PopController
时也是如此。
我不明白,有没有办法在内存中释放这个控制器,这样我的应用程序才能完美运行?
我知道当收到内存警告时,我必须释放屏幕上没有的东西 但在那种情况下我被卡住了,因为我需要的一切都在屏幕上......
答案 0 :(得分:1)
因此,您需要使用一些工具来帮助诊断问题,而这些工具都在仪器中。您可以使用“内存泄漏”工具查看视图控制器是否实际泄漏内存,还可以使用“内存分配”工具创建快照,以查看是否存在丢弃内存问题。 Here is a good tutorial about using Instruments for debugging.
答案 1 :(得分: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
答案 2 :(得分:-1)
将其添加到导航层次结构时使用自动释放视图控制器
MyUIViewController *aController = [[MyUIViewController alloc] initWithNibName:@"MyUIViewController" bundle:nil] autorelease];
[self.navigationController pushViewController:aController animated:YES];