NSXMLパーサーに間違ったURLを送信すると、アプリがクラッシュする理由(RSSリーダー)を調べようとします。私はEXC_BAD_ACCES
Sを手に入れました。それで、いくつかの検索の後で、私はゾンビを使わなければならないことに気づきました。そこで、次の引数を環境に追加しました。
CFZombieLevel = 3
NSMallocStaclLogging = YES
NSDeallocateZombies = NO
MallocStackLoggingNoCompact = YES
NSZombieEnabled = YES
NSDebugEnabled = YES
NSAutoreleaseFreedObjectCheckEnabled = YES
malloc_error_break
ブレークポイントとしても追加しました。次に、GUIに他のブレークポイントをいくつか追加し、[ビルドとデバッグ]を押しました。コンソールに次のメッセージが表示されます。
2010-08-28 18:41:49.761 RssReader[2850:207] *** -[XMLParser respondsToSelector:]: message sent to deallocated instance 0x59708e0
次のメッセージが表示されることもあります。
wait_fences: failed to receive reply: 10004003
「shellmalloc_history28500x59708e0」と入力すると、次のようになります。
...
ALLOC 0x5970870-0x59709d7 [size=360]: thread_a0aaa500 |start | main | UIApplicationMain | -[UIApplication _run] | CFRunLoopRunInMode | CFRunLoopRunSpecific | __CFRunLoopRun | __CFRunLoopDoSource1 | __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ | PurpleEventCallback | _UIApplicationHandleEvent | -[UIApplication sendEvent:] | -[UIApplication handleEvent:withNewEvent:] | -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] | -[UIApplication
...
----
FREE 0x5970870-0x59709d7 [size=360]: thread_a0aaa500 |start | main | UIApplicationMain | -[UIApplication _run] | CFRunLoopRunInMode | CFRunLoopRunSpecific | __CFRunLoopRun | __CFRunLoopDoSource1 | __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ | PurpleEventCallback | _UIApplicationHandleEvent | -[UIApplication sendEvent:] | -[UIApplication handleEvent:withNewEvent:] | -[UIApplication
...
ALLOC 0x59708e0-0x597090f [size=48]: thread_a0aaa500 |start | main | UIApplicationMain | -[UIApplication _run] | CFRunLoopRunInMode | CFRunLoopRunSpecific | __CFRunLoopRun | __CFRunLoopDoSource1 | __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ | PurpleEventCallback | _UIApplicationHandleEvent | -[UIApplication sendEvent:] | -[UIApplication handleEvent:withNewEvent:] | -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] | -[UIApplication
...
Binary Images:
0x1000 - 0x6ff3 +RssReader ??? (???) <6EBB16BC-2BCE-CA3E-C76E-F0B078995E2D> /Users/svp/Library/Application Support/iPhone Simulator/4.0.1/Applications/AF4CE7CA-88B6-44D4-92A1-F634DE7B9072/RssReader.app/RssReader
0xe000 - 0x1cfff3 +Foundation 751.32.0 (compatibility 300.0.0) <18F9E1F7-27C6-2B64-5B9D-BAD16EE5227A>
...
これは何を意味するのでしょうか?0x59708e0がどのオブジェクトであるかを知るにはどうすればよいですか?アプリがクラッシュする原因となるコードが見つかりません。私が知っている唯一のことは、それがrespondsToSelectorメッセージでなければならないということです。すべてのrespondsToSelectorメッセージにブレークポイントを追加しました。それらはヒットしますが、アプリはその時点ではクラッシュしません。また、1つを除いてコメントアウトしようとしたところ、アプリがクラッシュしました。コメントアウトされていないものはヒットしませんでした。メモリリークはどこにありますか?
次の紛らわしいことは、parseErrorOccurredデリゲートが呼び出されても、NSXMLパーサーがその作業を継続することです。エラーが2回スローされた後、アプリがクラッシュします。
Run with Peformance Toolでゾンビが無効になっているのはなぜですか?
編集:
今、私はこの指示を使用しました(投稿できません。申し訳ありません。スパム防止)これは機能しました。これはどういう意味ですか?
@Graham:パーサークラスでインスタンス化しますNSXMLParser
:
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
...
NSXMLParser *rssParser = [[NSXMLParser alloc] initWithData:responseData];
[rssParser setDelegate:self];
...
[rssParser parse];
//[rssParser release];
}
エラーを検索しているときに、リリース方法をコメントアウトしました。現在、rssParserがパーサークラスでリリースされることはありません。
私のRootViewController
クラスでは、パーサーをインスタンス化します。
- (void)loadData {
if (newsItems == nil) {
[activityIndicator startAnimating];
XMLParser *rssParser = [[XMLParser alloc] init];
[rssParser parseRssFeed:@"http://feeds2.feedburner.com/TheMdnShowtest" withDelegate:self];
[rssParser release];
rssParser = nil;
} else {
[self.tableView reloadData];
}
}
ここでリリースしなくてもクラッシュしません。しかし、割り当てごとにリリースを行う必要がありますか?または、自動リリースNSXMLParser
する必要がありconnectionDidFinishLoading
ますか?