很好地使用NSXMLParser,数组中的值都设置为最后一个条目

时间:2010-09-12 23:22:48

标签: iphone nsmutablearray nsxmlparser youtube-api

我使用NSXMLParser解析YouTube的API,然后获取我想要的所有内容并将其放入名为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 个答案:

答案 0 :(得分:3)

tc的回答是正确的,但让我重新说一句。

您缺少Objective-C的基本细节。

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

第一行声明一个变量tempVideo,它是指向Video类实例的指针,并为其分配对新分配的{{{{{{ 1}} class。

第二行重新指定Video作为tempVideo数组中对象的引用。它不是对象的副本,而是对数组中同一对象的引用。第一个实例 - 来自allVideos的实例 - 实际上已泄露。

未显示的是将视频对象添加到阵列的位置和方式。

答案 1 :(得分:1)

  1. Video * tempVideo定义了一个名为“tempVideo”的变量,它是一个指向视频的指针。
  2. [Video new]制作了一个新视频。
  3. tempVideo = [allVideos objectAtIndex:[allVideos count]-1];会覆盖您的指针(泄漏步骤2中创建的视频)。
  4. 如果您了解值和引用之间的区别,这会有所帮助,但这超出了本答案的范围。在没有看到你的代码的情况下,很难分辨出发生了什么,但我怀疑你是在重复地向同一个视频对象添加(指向)数组。