2010-10-04 90 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

相關問題