Delegates NSOperation不会取消NSXMLParser。继续调用委托上的方法导致崩溃

Delegates NSOperation不会取消NSXMLParser。继续调用委托上的方法导致崩溃,delegates,nsxmlparser,nsoperation,Delegates,Nsxmlparser,Nsoperation,我试图在另一个线程上下载一些XML,并对其进行解析 我释放“控制器”,然后调用NSOperationQueue上的cancelAllOperations。 并在试图将nSXMLParser的委托设置为nil的NSoperation上实现方法“cancel” 但过了一秒钟左右,NSXMLParser仍然处于活动状态,并对其委托(现在已不存在)调用方法,导致崩溃 我就是不明白,我做错了什么 #import "LoadXMLTheadedController.h" #import "LoadXMLTh

我试图在另一个线程上下载一些XML,并对其进行解析

我释放“控制器”,然后调用NSOperationQueue上的cancelAllOperations。 并在试图将nSXMLParser的委托设置为nil的NSoperation上实现方法“cancel”

但过了一秒钟左右,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
苹果的文档:

中止传播 停止解析器对象

-(无效)中止越狱

讨论 如果调用此方法, 委托,如果它实现
解析器:parseErrorOccurrend:
,是 通知取消解析 手术

我只是在猜测。在Objective-C中,通常将方法发送到
nil
不是问题。但是
NSXMLParser
可能会在内部执行一些特殊的操作

关于代码的一般说明
  • 学习如何正确地书写单词
  • 您不必将要释放的对象的委托设置为
    nil

NSOperation的cancel方法只需设置一个标志。它不会强制停止NSO操作本身。用户负责实现必要的代码来停止当前正在运行的任何东西


您需要定期检查是否设置了取消标志,然后自己在NSXMLParser上调用abort。

我知道这次聚会我迟到了,但我想我已经投入了2美分。如果退出@futureelite7,则永远不要覆盖
cancel
方法

相反,在NSOperation的整个子类中,您应该使用
isCancelled
定期验证操作是否已取消,并采取相应的行动。在这种情况下,我们希望中止解析

例如,在NSXMLParser委托方法之后,将其作为方法中的第一行:

// make your parser an ivar
if ([self isCancelled]) [operationParser abortParsing];
此外,我建议将NSOperation设置为NSXMLParser委托,以便将所有解析封装在NSOperation子类中


最后,仅供参考,中止解析将导致code
NSXMLParserDelegateAbortedParseError出现错误。在错误处理过程中要注意这一点

您是在使用垃圾收集器还是在手动管理内存?我是在手动管理内存我在方法“cancel”中调用abortParsing,但它不是cancel,这是问题所在。关于向委托发送nil,我只是希望它能停止NSXMLParser,因为AbortParser无法终止它。当我取消一个NSOperation时,我是否必须调用类似这样的东西:
[self willChangeValueForKey:@“isExecuting”]
\u isExecuting=否
[self-didChangeValueForKey:@“isExecuting”]
[self Will ChangeValueForkey:@“isFinished”]
\u isFinished=YES
[self-didChangeValueForKey:@“isFinished”]开始一个新问题,并将链接发送给我。