別のスレッドで XML をダウンロードして解析しようとしています。
「コントローラー」を解放し、NSOperationQueue で cancelAllOperations を呼び出します。そして、nSXMLParser のデリゲートを nil に設定しようとする NSoperation にメソッド 'cancel' を実装します。
しかし、1 秒ほど後に NSXMLParser がまだ生きていて、そのデリゲート (現在は存在しません) のメソッドをキックして呼び出し、クラッシュを引き起こします。
私はそれを理解していません、私は何を間違っていますか?
#import "LoadXMLTheadedController.h"
#import "LoadXMLThreaded.h"
@implementation LoadXMLTheadedController
- (id)initWithURLString:(NSString *)newString
{self = [super init];
queue = [[NSOperationQueue alloc] init];
loadXMLThreaded = [[LoadXMLThreaded alloc] initWithDelegate:self andXMLURLString:newString];
[queue addOperation:loadXMLThreaded];
return self;
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
NSLog(@" do some parsing.. ");
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
[queue cancelAllOperations];
[loadXMLThreaded release];
[queue release];
[super dealloc];
}
@end
//----------------------------------------------------------------//
#import "LoadXMLThreaded.h"
@implementation LoadXMLThreaded
- (id)initWithDelegate:(id)newDelegate andXMLURLString:(NSString *)newString
{
[super init];
delegate = newDelegate;
url = [[NSURL URLWithString:newString]retain];
return self;
}
- (void)cancel{
nSXMLParser.delegate = nil;
[nSXMLParser abortParsing];
}
- (void)main {
nSXMLParser = [[NSXMLParser alloc]initWithContentsOfURL:url];
nSXMLParser.delegate = delegate;
[nSXMLParser parse];
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
nSXMLParser.delegate = nil;
[nSXMLParser abortParsing];
[nSXMLParser release];
[url release];
[super dealloc];
}
@end