为什么我会得到EXC_BAD_ACCESS?
我有下面的代码,它按钮按下执行。起初它按预期工作,但第二次开始应用程序挂起,我得到EXC_BAD_ACCESS信号。为什么我会得到EXC_BAD_ACCESS?
- (IBAction) comicDetailsPressed:(id)sender {
static IssueProperties *props = nil;
if (props == nil) {
props = [ComicDataParser
parseComicForUrl:@"http://dummy.com/Jan.xml"];
}
NSLog(@"%d", [props totalPages]);
totalPages.text = [NSString stringWithFormat:@"%d", [props totalPages]];
}
你没有说它崩溃的线是什么,这意味着答案必须是推测性的。
你有一个指向IssueProperties
对象的静态指针,但是当你指定它时,你没有使用retain
。你可能应该。
这是假定parseComicForUrl:
的返回值是IssueProperties
对象或子类。
我假设text
属性是NSString
设置为copy
而不是retain
。如果不是,应该是。
您需要保留从+parseComicForUrl:
得到的对象。另外,为什么你不使用props
的实例变量?
将道具作为实例变量是个好主意,我只是在objective-c中尝试了一些XML解析的东西,所以我没有想到它。谢谢 – 2010-10-04 18:06:39
如果没有更多的背景下,将是不可能的回答是肯定的,但我首先想到的是这样的:
你static IssueProperties *props
不会是零第二次左右。相反,它将具有返回值[ComicDataParser parseComicForUrl]
。
我的猜测是,ComicDataParser
是autorelease
荷兰国际集团的回应,等你第二次左右有一个指针,是不是零,但现在指向一个已经release
d对象,它是无效的。
如果我是对的,你需要一个retain
的地方。
感谢您的快速回复,保留“道具”后问题得到解决。我想我应该再次通过内存管理指南。 – 2010-10-04 18:05:08
您对'text'属性的陈述看起来像是过度工程。虽然您应该复制可能来自任何客户端代码的字符串属性,但在这种情况下,我们只能看到由'+ stringWithFormat:'设置的属性,该属性返回一个不可变的字符串。因此,除非你知道关于Prashant的代码,否则拷贝是过度的。 – 2010-10-05 07:59:25
@格拉汉李我不明白你是如何看待它的过度工程;你必须为属性选择'assign','retain'或'copy',并且当你不使用'copy'时,你可以用'NSString'属性得到的问题是众所周知的......所以为什么不避免未来的问题,并尽可能降低风险? – 2010-10-05 19:05:52
@Shaggy Frog:YAGNI。 – 2010-10-05 20:10:36