我刚刚经历了一个客户项目,最初由我们编码然后被他们滥用!而且我们遇到了一个奇怪的崩溃,它在每个mac上都是一致的但在团队之间或在重新加载/重新启动Xcode / OSX之后不一致。
问题是我之前没有正确清理过物体时遇到的问题,但是我已经通过静态分析仪并且仍然在苦苦挣扎。
崩溃似乎总是发生,因为我们在VC中创建的对象被其他人覆盖,因此改变了他们的类型,因此有效的方法调用被抛出作为异常。
例如:
NSNumber *test1;
-(void)viewDidLoad {
test1 = [NSNumber numberWithInteger:7];
}
-(void)someOtherMethod {
NSLog(@"what was test? %@", [test stringValue]);
}
这当前在NSLog期间抛出一个无法识别的选择器异常,因为悬停在test1上告诉我是NSURLRequestInternal类型,如果我重新启动Xcode它可能会在其他地方!!
我该如何调试/解决这个问题!?!?
答案 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
指向的对象已被解除分配。