Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c NSMutableArray和自定义NSObject存在问题_Objective C_Arrays_Nsmutablearray_Null - Fatal编程技术网

Objective c NSMutableArray和自定义NSObject存在问题

Objective c NSMutableArray和自定义NSObject存在问题,objective-c,arrays,nsmutablearray,null,Objective C,Arrays,Nsmutablearray,Null,在这件事上我真的很绝望。我正在尝试制作一个框架,你可以用它搜索和播放YouTube视频。但是在测试的时候,我遇到了一个大问题 在搜索操作中,我将向NSMutableArray添加视频(NSObject的子类)。当我在main()中循环通过它时,得到的对象为零: 方法 - (NSArray *)videosInRange:(NSRange)range { if(range.length > 50) { [NSException raise:@"Range lenth > 50"

在这件事上我真的很绝望。我正在尝试制作一个框架,你可以用它搜索和播放YouTube视频。但是在测试的时候,我遇到了一个大问题

在搜索操作中,我将向NSMutableArray添加视频(NSObject的子类)。当我在main()中循环通过它时,得到的对象为零:

方法

- (NSArray *)videosInRange:(NSRange)range {
 if(range.length > 50) {
  [NSException raise:@"Range lenth > 50"
     format:@"The range of -videosInRange: can't be bigger than 50"];
  return nil;
 }

 if((range.location + range.length) > 999) {
  [NSException raise:@"Range to big" 
     format:@"The given range was to big (%d, %d)", range.location, range.length];
  return nil;
 }

 NSString *searchURLString = [[self feedURL] absoluteString];
 searchURLString = [searchURLString stringBySettingURLAttribute:@"start-index" value:[NSString stringWithFormat:@"%d",range.location + 1]];
 searchURLString = [searchURLString stringBySettingURLAttribute:@"max-results" value:[NSString stringWithFormat:@"%d",range.length]];

 NSLog(@"%@",searchURLString);
 NSURL *url = [NSURL URLWithString:searchURLString];
 NSXMLDocument *xmlDoc = [[NSXMLDocument alloc] initWithContentsOfURL:url 
                 options:0
                   error:NULL];
 if(!xmlDoc)
  return nil;

 NSArray *videoElements = [[xmlDoc rootElement] elementsForName:@"entry"];
 NSMutableArray *videos = [[NSMutableArray alloc] initWithCapacity:[videoElements count]];
 register int i;
 for(i = 0; i < [videoElements count]; i++) {
  NSAutoreleasePool *addPool = [[NSAutoreleasePool alloc] init];

  YTVideo *vid = [[YTVideo alloc] initWithXMLElement:[videoElements objectAtIndex:i]];
  [videos addObject:vid];
  [vid release];

  [addPool drain];
 }

 NSArray *retValue = [NSArray arrayWithArray:videos];
 [videos release];
 return retValue;
}

我只有在被要求时才能得到标题(和其他视频信息)。-stringByDecodingHTMLEntities工作正常(分类在NSString上)。

我已经在
-init
方法中重写了代码并初始化了所有实例变量

也许只是标题为nil?我认为
YTVideo
中的
initWithXMLElement
方法可能有问题。我们可以看一下《YT视频》课程吗?谢谢你的回答,我已经更新了我的问题,你认为这个程序的输出是什么?它是否打印
“nil”
,或
“(null)”
?它打印(null),但我注意到的另一件事是,当我在main()中的while循环末尾插入break语句时,程序崩溃。调试器的日志:“2主;1 nspoputoreleasepool;0 objc_msgSend”。如果你想让我上传整个项目,我当然愿意这样做!
int main(int argc, const char *argv[]) {
 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

 YTSearchFeed *feed = [[YTSearchFeed alloc] initWithSearch:@"Eminem"];
 long long results = [feed videoCount];
 NSLog(@"%lld videos for search", results);

 long long i = 0;
 while(results != 0) {
  int length = (results >= 50) ? (50) : (results);

  NSArray *videos = [feed videosInRange:NSMakeRange(i, length)];
  NSLog(@"L: %d", [videos count]);
  int z;
  for(z = 0; z < [videos count]; z++, i++) {
   YTVideo *vid = [videos objectAtIndex:z];
   NSString *title = [vid title];
   NSLog(@"%d: %@", i+1, title);
  }

  results -= length;
 }

 [pool drain];

 return NSApplicationMain(argc, argv);
}
- (id)initWithXMLElement:(NSXMLElement *)element {
    self = [super init];
    if(self != nil) {
        _XMLElement = [element copy];
    }
    return self;
}

- (NSString *)title {
    if(!_title) {
        NSString *str = [[[self XMLElement] firstElementWithName:@"title"] stringValue];
        _title = [[str stringByDecodingHTMLEntities] retain];
    }

    return [[_title copy] autorelease];
}