2010-08-13 2 views
0

Я действительно отчаянный в этом вопросе. Я пытаюсь создать 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).

+0

Может быть, только название является ноль? Я думаю, что может возникнуть проблема с вашим методом 'initWithXMLElement' в' YTVideo'. Можем ли мы увидеть класс «YTVideo»? –

+0

Спасибо за ваш ответ, я обновил свой вопрос – v1Axvw

+0

Что именно вы видите в качестве выходных данных из этой программы? Печатает ли это '" nil "' или '' (null) "'? –

ответ

0

Я переписан код и инициализировать все переменные экземпляра в -init метод

Смежные вопросы