EXC_BAD_ACCESS 在多个设备上使用 iCloud

Posted

技术标签:

【中文标题】EXC_BAD_ACCESS 在多个设备上使用 iCloud【英文标题】:EXC_BAD_ACCESS using iCloud on multiple devices 【发布时间】:2012-05-24 18:47:47 【问题描述】:

我正在使用 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(code=10)。

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

问题可能出在某些项目/代码符号设置中?有什么想法吗?

谢谢!

【问题讨论】:

【参考方案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;

【讨论】:

这听起来很棒。我自己也遇到了这个崩溃,遗憾的是永远无法重现它。但这听起来像是你发现了它。希望这也能为我解决。您不知道如何对其进行测试?

以上是关于EXC_BAD_ACCESS 在多个设备上使用 iCloud的主要内容,如果未能解决你的问题,请参考以下文章

设备上的 Xcode5 调试 - EXC_BAD_ACCESS

iPhone 模拟器启动时的 EXC_BAD_ACCESS。应用程序在设备上运行

长按 EXC_BAD_ACCESS;没有僵尸活动

在 glGenTextures 上获取 EXC_BAD_ACCESS

Alamofire 3.0 - iOS 9.1 上的 EXC_BAD_ACCESS

EXC_BAD_ACCESS 在设备中,不在模拟器中