EXC_BAD_ACCESS在多个设备上使用iCloud

时间:2012-05-24 18:47:47

标签: objective-c ios exc-bad-access icloud

我正在使用iCloud创建一个应用程序。但我有一些问题。它使用NSFileWrapper在iCloud上创建目录,然后在NSFileWrapper目录中创建NSData(容器)文件。我正在使用此代码将NSFileWrapper转换为NSMutableArray:

NSFileWrapper *MyWrapper=[[[MyDocument data] fileWrappers] objectForKey:@"myFile.doh"];
    NSData *MyData=[NSData dataWithData:[MyWrapper regularFileContents]];
    NSMutableArray *MyList=[NSPropertyListSerialization propertyListFromData:MyData mutabilityOption:NSPropertyListMutableContainers format:nil errorDescription:nil];

它只能在创建此容器的设备上正常工作。在其他设备上,此代码的结果是BAD_ACCESS(在代码的第二行,我开始对数据执行某些操作)。在调试时,函数“regularFileContents”返回具有正确数据大小的正确对象,但是当我尝试读取此数据时,会发生BAD_ACEESS(代码= 10)。

我正在使用ARC,所以这不是内存管理的错误。

可能是某些项目/代码签名设置存在问题?有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

我也遇到了这个问题,经过多次实验后我发现即使外包装已下载,内部内容还没有实际下载,导致对regularFileContents的调用失败。

我一直在MyWrapper上调用 startDownloadingUbiquitousItemAtURL ,一旦完成,错误就消失了。这是一种检查文件下载状态的方法(假设您知道MyWrapper的URL)并在尚未下载的情况下开始下载。

-(BOOL)downloadFileIfNotAvailable:(NSURL*)fileURL
{
    NSNumber *isInCloud = nil;

    if ([fileURL getResourceValue:&isInCloud forKey:NSURLIsUbiquitousItemKey error:nil])
    {
        if ([isInCloud boolValue]) {
            NSNumber *isDownloaded = nil;
            if ([fileURL getResourceValue:&isDownloaded forKey:NSURLUbiquitousItemIsDownloadedKey error:nil])
            {
                if ([isDownloaded boolValue])
                {
                    return YES;
                }

                NSError *error = nil;
                [[NSFileManager defaultManager] startDownloadingUbiquitousItemAtURL:fileURL error:&error];

                if (error)
                {
                    NSLog(@"Download Failed :: %@", error);
                }

                return NO;
            }
        }
    }

    return YES;
}