Я действительно отчаянный в этом вопросе. Я пытаюсь создать Framework, с которым вы можете искать и воспроизводить видео на YouTube. Но, тестируя его, я столкнулся с большой проблемой.Проблема с NSMutableArray и пользовательским NSObject
В операции поиска я добавляю YTVideos (подкласс NSObject) в NSMutableArray. Когда я петля через него в основном(), я получаю Nil-объекты:
Метод
- (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;
}
основной()
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);
}
Я надеюсь, что кто-то может принять время, чтобы посмотреть на это, и если вам нужна больше информации, просто спросите.
Спасибо заранее, ief2
EDIT: YTVideo
- (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];
}
я получаю название (и другую информацию, видео) только тогда, когда он просил. -stringByDecodingHTMLEntities отлично работает (Категория на NSString).
Может быть, только название является ноль? Я думаю, что может возникнуть проблема с вашим методом 'initWithXMLElement' в' YTVideo'. Можем ли мы увидеть класс «YTVideo»? –
Спасибо за ваш ответ, я обновил свой вопрос – v1Axvw
Что именно вы видите в качестве выходных данных из этой программы? Печатает ли это '" nil "' или '' (null) "'? –