将文件从磁盘加载到NSMutableArray会从内存中删除NSMutableArray

时间:2014-11-14 14:58:47

标签: ios objective-c cocoa-touch nsmutablearray

我正在将文件加载到NSMutableArray。我是这样做的:

if(!self.dataArray){
    self.dataArray = [[NSMutableArray alloc] init];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                         NSUserDomainMask, YES);
    NSString *arrayPath = [[paths objectAtIndex:0]
                 stringByAppendingPathComponent:@"array.out"];
    self.dataArray = [NSMutableArray arrayWithContentsOfFile:arrayPath];
}

加载到文件中的数组包含多个NSDictionaries

但是,这会以某种方式释放内存中的数组,因为在执行此操作后我记录dataArray时会记录nil。怎么样?

更新

我已经发现[NSMutableArray arrayWithContentsOfFile:arrayPath]正在记录为nil,因为我将内容上传到文件的代码没有创建文件:

// write data to disk
  NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,                                                                                          NSUserDomainMask, YES);
  NSString *arrayPath = [[paths objectAtIndex:0]stringByAppendingPathComponent:@"array.out"];
 [self.dataArray writeToFile:arrayPath atomically:YES];

 NSLog(@"uploaded file: %@", arrayPath); // logs an arrayPath, but one that doesn't exists.

3 个答案:

答案 0 :(得分:1)

检查以下内容,

  1. 检查 dataArray 属性?如果是,请更改为 strong
  2. 使用

    检查文件是否存在于路径中

    [[NSFileManager defaultManager] fileExistsAtPath:arrayPath];

  3. 通过记录来验证文件是否包含预期内容。

  4. 确认文件内容被组织为属性列表(plist)。在plist editor / Xcode中验证它。

  5. 如果您动态创建它,请检查您要写入的路径。

  6. 确认将 NSArray 写入plist的方法。使用

    [array writeToFile:path atomically:YES];

  7. 注意:

    如果您正在动态创建文件,并且您正在模拟器上进行测试;您可以 通过记录文件路径找到该文件,并在Finder上跟踪它。

    物业清单参考

    1. Apple documentation

答案 1 :(得分:0)

根据Apple文档,如果无法打开文件或者无法将文件内容解析为数组,则数组返回nil。

您是否使用[writeToFile:atomically:]方法将数组写入文件?

此外,请确保filePath字符串在写入和读取两端完全匹配。当我发现我拼错了文件的名称或使用了错误的文件扩展名时,我浪费了很多时间来寻找一个bug。

另一种可能性:您确认此代码正在执行吗?有时我必须在if条件下将(!self.someProperty)更改为(self.someProperty!= nil)以获取此类代码才能运行。

答案 2 :(得分:0)

Peter Segerblom和wildBillMunson是对的:如果无法打开文件或者无法将其内容解析为数组,则数组返回nil。

你说“array.out”是一个NSDictionaries数组。每当我拥有那组数据时,我就会使用plist类型的文件并以这种方式读取它:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);
NSString *directory = [paths objectAtIndex:0];
NSString *fullPath = [directory stringByAppendingPathComponent:@"data.plist"];
NSString *errorDesc = nil;
NSPropertyListFormat format;
NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:fullPath];
NSArray *data = (NSArray *)[NSPropertyListSerialization propertyListFromData:plistXML mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:&errorDesc];

务必检查fullPath是否未返回nil。

希望这有帮助!