2010-10-04 89 views
0

我有下面的代码,它按钮按下执行。起初它按预期工作,但第二次开始应用程序挂起,我得到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]]; 
} 

回答

2

你没有说它崩溃的线是什么,这意味着答案必须是推测性的。

你有一个指向IssueProperties对象的静态指针,但是当你指定它时,你没有使用retain。你可能应该。

这是假定parseComicForUrl:的返回值是IssueProperties对象或子类。

我假设text属性是NSString设置为copy而不是retain。如果不是,应该是。

+0

您对'text'属性的陈述看起来像是过度工程。虽然您应该复制可能来自任何客户端代码的字符串属性,但在这种情况下,我们只能看到由'+ stringWithFormat:'设置的属性,该属性返回一个不可变的字符串。因此,除非你知道关于Prashant的代码,否则拷贝是过度的。 – 2010-10-05 07:59:25

+0

@格拉汉李我不明白你是如何看待它的过度工程;你必须为属性选择'assign','retain'或'copy',并且当你不使用'copy'时,你可以用'NSString'属性得到的问题是众所周知的......所以为什么不避免未来的问题,并尽可能降低风险? – 2010-10-05 19:05:52

+0

@Shaggy Frog:YAGNI。 – 2010-10-05 20:10:36

1

您需要保留从+parseComicForUrl:得到的对象。另外,为什么你不使用props的实例变量?

+0

将道具作为实例变量是个好主意,我只是在objective-c中尝试了一些XML解析的东西,所以我没有想到它。谢谢 – 2010-10-04 18:06:39

1

如果没有更多的背景下,将是不可能的回答是肯定的,但我首先想到的是这样的:

static IssueProperties *props不会是零第二次左右。相反,它将具有返回值[ComicDataParser parseComicForUrl]

我的猜测是,ComicDataParserautorelease荷兰国际集团的回应,等你第二次左右有一个指针,是不是零,但现在指向一个已经release d对象,它是无效的。

如果我是对的,你需要一个retain的地方。

+0

感谢您的快速回复,保留“道具”后问题得到解决。我想我应该再次通过内存管理指南。 – 2010-10-04 18:05:08

相关问题