2010-11-08 5 views
0

Я имею дело с проблемой, которая сводит меня с ума. Я просмотрел другие форумы, и мой код выглядит нормально, однако он не работает при вызове метода addObject для NSMutableArray. Я реализую простой XML-класс анализатора и хранить часть информации в NSMutableArray:addObject для сбоев 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: @""]; 
    } 


} 

[аннотаций 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”. 

Вот краткое описание кода:

Аннотация простой класс, производный от NSObject. Я реализую методы init и dealloc. Первый один не делает ничего, просто возвращает «я», тогда как dealloc вызывает родитель и высвобождает 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; 

Мой метод инициализации выглядит следующим образом:

- (id) initFromFile: (NSString*)pathToFile{ 
    //..... 
    annotations = [[NSMutableArray alloc] initWithCapacity: 10]; 
    [addressParser setDelegate:self]; 
    //...... 
} 

Debugging предлагает объект я добавляю в «аннотации» массив не ноль, однако Я не могу даже вставить первый. Почему я получаю исключение NSInvalidArgumentException? Почему NSCFDictionary: addObject, если мой массив относится к классу NSMutableArray? Что-нибудь об использовании NSMutableArray, которое мне не хватает?

Мои данные платформы: - Запуск iPhone Simulator версии 4.1 (225) - Base SDK и цель развертывания: iOSDevice 4,1 (цель) IPAD - НКУ 4,2

Любой ключ будет любезно оценены. Заранее спасибо.

Луис

+5

Все, что происходит, не видно из кода, который вы опубликовали. Как-то «аннотации» представляют собой NSDictionary вместо массива; скорее всего, указатель переписывается. –

+0

Ваше свойство аннотаций - это чтение/запись, а не только то, что я ожидал бы для mutableArray, созданного в init класса. Зачем? Может быть, вы случайно назовете сеттера где-нибудь? –

ответ

2

Unrecognized selector sent to <blah> почти всегда означает, что рассматриваемый объект был освобожден, а другой объект (другого типа) затем был выделен с использованием того же хранилища.

Чтобы отслеживать это, просмотрите setting NSZombieEnabled, который сохраняет все освобожденные объекты как «зомби» вместо фактического освобождения памяти.

0

Комментарий Джона стоит изучить. Сделайте поиск по всему проекту для всех вхождений «аннотаций». Кроме того, используйте отладчик, чтобы убедиться, что строка, по которой вы думаете, что она останавливается, действительно правильная.

Также: у меня было странное поведение в моих приложениях, когда я ссылаюсь на свойство P как равное P вместо self.P. Я думаю, вы должны пройти через свой код и внести это изменение.

Только что увидел комментарий Дэвида, который, как я думаю, связан с моим комментарием. Обычная P не сохраняет; сам.P ... Исправьте это, и ваши проблемы могут закончиться.

2

Ошибка показывает, что объект, который вы отправляете addObject: to является NSDictionary. (Помните, что фактический класс объекта может отличаться от того, как вы его объявили, даже если все работает.) Это может произойти, если у вас есть устаревший указатель - попробуйте NSZombieEnabled для отслеживания этого.

В качестве обратного вызова даже возможно, что ваш PatientBundle больше не действителен.