2011-04-23 98 views
0

我再次來到互聯網,戴着帽子。 :)使用類方法創建一個NSArray

我試圖使用一個類方法返回包含其它數組作爲元素填充的陣列:

.H:

@interface NetworkData : NSObject { 

} 

    +(NSString*) getCachePath:(NSString*) filename; 
    +(void) writeToFile:(NSString*)text withFilename:(NSString*) filePath; 
    +(NSString*) readFromFile:(NSString*) filePath; 
    +(void) loadParkData:(NSString*) filename; 
    +(NSArray*) generateColumnArray:(int) column type:(NSString*) type filename:(NSString*) filename; 

@end 

的.m:

#import "NetworkData.h" 
#import "JSON.h" 
#import "Utility.h" 


@implementation NetworkData 

+(NSString*) getCachePath:(NSString*) filename { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *cachePath = [NSString stringWithFormat:@"%@/%@", [paths objectAtIndex:0], filename]; 
    [paths release]; 
    return cachePath; 
} 

+(void) writeToFile:(NSString*)text withFilename:(NSString*) filename { 
    NSMutableArray *array = [[NSArray alloc] init]; 
    [array addObject:text]; 
    [array writeToFile:filename atomically:YES]; 
    [array release]; 
} 

+(NSString*) readFromFile:(NSString*) filename { 
    NSFileManager* filemgr = [[NSFileManager alloc] init]; 
    NSData* buffer = [filemgr contentsAtPath:filename]; 
    NSString* data = [[NSString alloc] initWithData:buffer encoding:NSUTF8StringEncoding]; 
    [buffer release]; 
    [filemgr release]; 
    return data; 
} 

+(void) loadParkData:(NSString*) filename { 
    NSString *filePath = [self getCachePath:filename]; 
    NSURL *url = [NSURL URLWithString:@"http://my.appserver.com"]; 
    NSData *urlData = [NSData dataWithContentsOfURL:url]; 
    [urlData writeToFile:filePath atomically:YES]; 
} 

+(NSArray*) generateColumnArray:(int) column type:(NSString*) type filename:(NSString*) filename { 
    // NSLog(@"generateColumnArray called: %u %@ %@", column, type, filename); 
    // productArray = [[NSMutableArray alloc] init]; 
    // NSString *filePath = [self getCachePath:filename]; 
    // NSString *fileContent = [self readFromFile:filePath]; 
    // NSString *jsonString = [[NSString alloc] initWithString:fileContent]; 
    // NSDictionary *results = [jsonString JSONValue]; 
    // NSArray *eventsArray = [results objectForKey:type]; 
    // NSInteger* eventsArrayCount = [eventsArray count]; 
    // NSInteger* a; 

    // for (a = 0; a < eventsArrayCount; a++) { 
    //  NSArray *eventsColSrc = [eventsArray objectAtIndex:a]; 
    //  NSArray *blockArray = [eventsColSrc objectAtIndex:column]; 
    //  [productArray addObject:blockArray]; 
    //  [blockArray release]; 
    // } 

    // [eventsArray release]; 
    // [results release]; 
    // [jsonString release]; 
    // [fileContent release]; 
    // [filePath release]; 

    // [a release]; 
    // [eventsArrayCount release]; 

    // return productArray; 
    } 

-(void)dealloc { 
    [super dealloc]; 
} 

@end 

..和電話:

NSArray* dataColumn = [NetworkData generateColumnArray:0 type:@"eventtype_a" filename:@"data.json"]; 

該方法內的代碼有效(不是很漂亮,我知道 - noob在工作)。它本質上是沒有意義的,因爲只是調用它(沒有活動代碼,如圖所示)會導致應用程序在啓動屏幕顯示其他任何內容之前退出。

我敢打賭,這是一個頭燈 - 非常感謝你的任何知識,你可以放棄。

回答

0

如果您的應用程序崩潰,控制檯中很可能會顯示一條消息,告訴您爲什麼。在尋求幫助時包含該信息總是有幫助的。

一個明顯的問題是,你的+ generateColumnArray ...方法應該返回一個指向NSArray的指針,但是方法中的所有代碼都被註釋掉了,它沒有返回任何東西,而且誰知道什麼是分配給dataColumn。嘗試在方法的末尾添加一個return nil;,看看是否可以修復崩潰。但是,再次看看錯誤消息,具體查看代碼崩潰的原因,並且這會導致您找到解決方案。

+0

控制檯沒有任何東西 - 那是什麼讓我扭曲......它只是回落到跳板。返回「零」沒有任何區別。感謝您的提示,儘管... – JSpread 2011-04-23 06:45:13

+0

所以,第一個問題是(當然)內存管理......通過@interface中的常規調整修復了問題。現在,該方法返回數據 - 然後 - 它崩潰。回到繪圖板! – JSpread 2011-04-23 06:59:41

0

嗯,你沒有從你的註釋掉的代碼中返回一個有效的值。你下一步使用'dataColumn'是什麼?在調試器下運行應該指出你正確的問題,不是嗎?

+0

現在只有一件東西是NSLog ...數組應該包含七個對象,但我只能看到NSLog結果中的索引0和3處的對象即將關閉之前。噢 - 我有一個漫長的週末去弄明白。 :) – JSpread 2011-04-23 07:14:58

+0

另外,我從來沒有用過[[NSFileManager alloc] init]。改爲使用[NSFileManager defaultManager]。另外,不要在readFromFile:中釋放'buffer'。 ('緩衝區'是自動釋放的。) – nielsbot 2011-04-26 11:54:34