我正在处理一个让我发疯的问题。我查看了其他论坛,我的代码似乎没问题,但是在为NSMutableArray调用addObject方法时失败了。我正在实现一个简单的xml解析器类,并将一些信息存储在NSMutableArray中:
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
if([elementName isEqualToString:@"Image"]){
[images setObject: [[imageFile copy] autorelease] forKey: [NSNumber numberWithInt: imageId]];
return;
}
if([elementName isEqualToString:@"Annotation"]){
//Here create the annotation object
Annotation *newAnnot = [[Annotation alloc] init];
newAnnot.imageId = imageId;
newAnnot.annDescription = [[annDescription copy] autorelease];
newAnnot.annLocation = [[annLocation copy] autorelease];
[annotations addObject: newAnnot];
[newAnnot release];
return;
}
if([elementName isEqualToString: @"Patient"] || [elementName isEqualToString: @"Images"] || [elementName isEqualToString: @"Annotations"]){
[currentSection setString: @""];
}else {
[currentElement setString: @""];
}
}
[annotations addObject:newAnnot]使应用程序接收SIGABRT信号!
2010-11-08 17:15:00.786 Touches[1430:207] *** -[NSCFDictionary addObject:]: unrecognized selector sent to instance 0x4b1bb50 2010-11-08 17:15:00.788 Touches[1430:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSCFDictionary addObject:]: unrecognized selector sent to instance 0x4b1bb50' 2010-11-08 17:15:00.789 Touches[1430:207] Stack: (
42174544,
43332396,
42183259,
41645686,
41642482,
18858,
39384333,
70873863,
70897681,
39381417,
17100,
8863,
2234926,
38538931,
38537114,
2234111,
38538931,
38544407,
38545466,
38538931,
38537114,
2230794,
2239193,
103026,
108372,
134462,
115959,
147928,
44216700,
41453724,
41449640,
107041,
140146,
8296 ) terminate called after throwing an instance of 'NSException' Program received signal: “SIGABRT”. (gdb) continue Program received signal: “SIGABRT”.
这里是代码的简要说明:
Annotation是一个派生自NSObject的简单类。我正在实现init和dealloc方法。第一个没有做任何事情,只返回“self”,而dealloc调用parent并释放2个字符串
@interface Annotation : NSObject {
int imageId;
NSString *annDescription;
NSString *annLocation;
}
@property (nonatomic, assign) int imageId;
@property (nonatomic, retain) NSString *annDescription;
@property (nonatomic, retain) NSString *annLocation;
直到这里没什么奇怪的。然后看看实现解析的类:
@interface PatientBundle : NSObject <NSXMLParserDelegate> {
//............
NSMutableArray *annotations;
//.............
}
@property (nonatomic, retain) NSMutableArray *annotations;
我的init方法如下所示:
- (id) initFromFile: (NSString*)pathToFile{
//.....
annotations = [[NSMutableArray alloc] initWithCapacity: 10];
[addressParser setDelegate:self];
//......
}
调试表明我添加到“annotations”数组中的对象不是nil,但是我甚至无法插入第一个。为什么我会收到NSInvalidArgumentException?为什么NSCFDictionary:addObject如果我的数组是类NSMutableArray?关于我缺少的NSMutableArray的使用是什么?
我的平台详情: - 运行iphone Simulator 4.1(225)版 - 基础SDK和部署目标:iOSDevice 4.1(目标IPAD) - GCC 4.2
任何线索都将受到赞赏。提前谢谢。
路易斯
答案 0 :(得分:2)
Unrecognized selector sent to <blah>
几乎总是意味着有问题的对象被释放了,而另一个对象(不同类型)后来被分配了相同的存储空间。
要追踪这一点,请查看setting NSZombieEnabled,它将所有释放的对象保持为“僵尸”,而不是实际释放内存。
答案 1 :(得分:2)
错误显示您发送addObject:to的对象是NSDictionary。 (请记住,对象的实际类可能与您声明它的方式不同,即使事情正常。)如果您有一个陈旧的指针,可能会发生这种情况 - 尝试NSZombieEnabled来跟踪那个。
作为回调,您的PatientBundle甚至可能不再有效。
答案 2 :(得分:0)
约翰的评论值得研究。对所有出现的“注释”进行项目范围的查找。此外,使用调试器确保您认为它停在的线路确实是正确的线路。
另外:当我将属性P称为普通P而不是self.P时,我的应用程序中出现了奇怪的行为。我认为你应该检查你的代码并进行更改。
刚刚看到David的评论,我认为这与我的评论有关。普通P不做保留; self.P。解决这个问题,你的麻烦可能已经结束。