【问题标题】:Using a class method to create an NSArray使用类方法创建 NSArray
【发布时间】:2011-04-23 06:30:27
【问题描述】:

我又一次来到互联网上,戴着帽子。 :)

我正在尝试使用类方法返回一个包含其他数组作为元素的填充数组:

.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"];

该方法中的代码有效(我知道这不是很漂亮 - 菜鸟在工作)。它本质上没有实际意义,因为只是调用它(没有活动代码,如图所示)会导致应用在启动屏幕显示其他任何内容之前退出。

我敢打赌,这是一个令人头疼的问题 - 非常感谢您提供的任何知识。

【问题讨论】:

    标签: ios class methods nsarray


    【解决方案1】:

    如果您的应用崩溃,控制台中很可能会显示一条消息,告诉您原因。在寻求帮助时包含该信息总是有帮助的。

    一个明显的问题是你的 +generateColumnArray... 方法应该返回一个指向 NSArray 的指针,但是方法中的所有代码都被注释掉了,它没有返回任何东西,并且谁知道分配了什么到dataColumn。尝试在方法末尾添加一个return nil;,看看是否可以修复崩溃。不过,请再次查看错误消息,了解代码崩溃的具体原因,这将引导您找到解决方案。

    【讨论】:

    • 控制台中什么都没有 - 这就是让我扭曲的原因......它只是回到了 Springboard。返回“nil”没有任何区别。不过感谢您的提示...
    • 所以,第一个问题(当然)是内存管理......通过@interface 中的常规调整解决了这个问题。现在,该方法返回它的数据 - 然后 - 它崩溃了。回到绘图板!
    【解决方案2】:

    好吧,您没有从注释掉的代码中返回有效值。你下一步用什么'dataColumn'?在调试器下运行应该可以指出问题所在,不是吗?

    【讨论】:

    • 它现在唯一使用的是一个 NSLog...该数组应该包含七个对象,但我只看到 NSLog 结果中索引 0 和 3 处的对象,就在它下降之前。哦,好吧 - 我有一个漫长的周末来解决这个问题。 :)
    • 另外,我从未使用过 [ [ NSFileManager alloc ] init ]。请改用 [ NSFileManager defaultManager ]。另外,不要在 readFromFile: 中释放“缓冲区”。 (“缓冲区”是自动释放的。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 2021-07-29
    • 1970-01-01
    相关资源
    最近更新 更多