如何调试iPhone SDK内存重新分配问题?

时间:2011-03-29 21:51:38

标签: iphone objective-c ios4

我刚刚经历了一个客户项目,最初由我们编码然后被他们滥用!而且我们遇到了一个奇怪的崩溃,它在每个mac上都是一致的但在团队之间或在重新加载/重新启动Xcode / OSX之后不一致。

问题是我之前没有正确清理过物体时遇到的问题,但是我已经通过静态分析仪并且仍然在苦苦挣扎。

崩溃似乎总是发生,因为我们在VC中创建的对象被其他人覆盖,因此改变了他们的类型,因此有效的方法调用被抛出作为异常。

例如:

NSNumber *test1;

-(void)viewDidLoad {
  test1 = [NSNumber numberWithInteger:7];
}

-(void)someOtherMethod {
  NSLog(@"what was test? %@", [test stringValue]);
}

这当前在NSLog期间抛出一个无法识别的选择器异常,因为悬停在test1上告诉我是NSURLRequestInternal类型,如果我重新启动Xcode它可能会在其他地方!!

我该如何调试/解决这个问题!?!?

3 个答案:

答案 0 :(得分:1)

你忘了保留test1所以它会被自动释放,因此崩溃

尝试使用NSZombieEnabled来调试这种东西。

答案 1 :(得分:1)

每次都应该崩溃。

让我们看一下代码。

test1 = [NSNumber numberWithInteger:7];

这会创建一个NSNumber并将其分配给实例。但是,一旦运行主事件循环,就会安排NSNumber重新分配。

NSLog(@"what was test? %@", [test stringValue]);

这可能是在主要事件循环开始之后运行的。此时,测试(我认为这应该是test1)指向一个悬空指针。访问它会崩溃。

阅读Apple有关内存管理的文档是无可替代的:http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

这将解释您需要了解的内容。但基本上,您应该使用[[NSNumber alloc] initWithInteger:7]或保留它(可能使用属性语法)。

但除非你阅读Apple关于这个主题的文档,否则你将永远追逐内存错误。

答案 2 :(得分:1)

test1 = [NSNumber numberWithInteger:7];

应该是

test1 = [[NSNumber numberWithInteger:7] retain];

或(更好)

test1 = [[NSNumber alloc] initWithInteger:7];

numberWithInteger:返回一个自动释放的对象,因此在调用someOtherMethod时,test1指向的对象已被解除分配。