хорошо используя NSXMLParser значения внутри массива все установлены в последнюю запись - PullRequest
0 голосов
/ 13 сентября 2010

Я использую NSXMLParser для анализа API YouTube, и я получаю весь контент, который хочу, и помещаю его в класс с именем Video.Когда я пишу в класс изнутри parserDidEndElement и заканчиваю это видео, я записываю класс в NSMutableArray .Затем я NSLog название видео, которое было зарегистрировано в массиве.Это отличается для каждого видео.Я использую метод addObject: для добавления видео в массив.Однако, когда я использую parserDidEndDocument , я использую цикл for для чтения массива, и все записи имеют одинаковое значение заголовка последнего добавленного объекта!Что здесь происходит?

Я называю это в didEndElement:

Video *tempVideo = [Video new];
NSString *title = @"";
tempVideo = [allVideos objectAtIndex:[allVideos count]-1];
title = tempVideo.videoTitle;
NSLog(@"1videoTitle = %@", title);

Возвращается для каждого элемента 1videoTitle = (название видео)

Я называю это в didEndDocument:

int i;
Video *tempVideo = [Video new];
NSString *title = @"";
for(i=0;i<[allVideos count];i++){
    tempVideo = [allVideos objectAtIndex:i];
    title = tempVideo.videoTitle;
    NSLog(@"videoTitle = %@", title);
}

Возвращается для каждого элемента videoTitle = (последний добавленный заголовок видео для всех 19 видео)

Ответы [ 2 ]

3 голосов
/ 13 сентября 2010

ответ ТК правильный, но позвольте мне перефразировать.

Вам не хватает очень простой детали Objective-C.

Video *tempVideo = [Video new];
tempVideo = [allVideos objectAtIndex:[allVideos count]-1];

Первая строка объявляет переменную tempVideo, которая является указателем на экземпляр Video класса , и присваивает ей ссылку на недавно выделенный экземпляр Video класса.

Вторая строка переназначает tempVideo как ссылку на объект из массива allVideos. Это не копия объекта, а ссылка на тот же объект в массиве. Первый экземпляр - тот, что из [Video new] - фактически пропущен.

Не показано, где и как вы добавляете объекты Video в массив.

1 голос
/ 13 сентября 2010
  1. Video * tempVideo определяет переменную с именем "tempVideo", которая является указателем на видео.
  2. [Video new] создает новое видео.
  3. tempVideo = [allVideos objectAtIndex:[allVideos count]-1]; перезаписывает ваш указатель(утечка видео, созданного на шаге 2).

Помогает, если вы понимаете разницу между значением и ссылкой, но это выходит за рамки этого ответа.Не видя ваш код, трудно сказать, что происходит, но я подозреваю, что вы неоднократно добавляете (указатели) один и тот же видеообъект в массив.

...