2011-04-23 67 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