addObject для NSMutableArray вылетает! - PullRequest
0 голосов
/ 08 ноября 2010

Я имею дело с проблемой, которая сводит меня с ума.Я смотрел на другие форумы, и мой код, кажется, в порядке, однако он не работает при вызове метода addObject для NSMutableArray.Я реализую простой класс парсера 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”.

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

Аннотация - это простой класс, производный от 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];
    //......
}

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

Информация о моей платформе: - Запуск iphone Simulator версии 4.1 (225) - Базовый SDK и цель развертывания: iOSDevice 4.1 (целевой IPAD) - GCC 4.2

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

Луис

Ответы [ 3 ]

2 голосов
/ 08 ноября 2010

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

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

2 голосов
/ 08 ноября 2010

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

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

0 голосов
/ 08 ноября 2010

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

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

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

...