iOS   发布时间:2022-05-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了objective-c – NSFileVersion调用期间EXC_BAD_ACCESS调用removeOtherVersionsOfItemAtURL:内部协调写入块大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我正在使用似乎是NSFileVersion类方法removeOtherVersionsOfItemAtURL的简单调用:在一个协调的写入块内部进行一些iCloud冲突解决. 当我的设备进入“spaz模式”时,这是在少数设备上反复打开和关闭应用程序的技术术语,会在内部抛出EXC_BAD_ACCESS异常.代码段: - (void)compareVersionChanges:(NSFileVersio
我正在使用似乎是NSFiLeversion类方法removeOtherVersionsOfItemAtURL的简单调用:在一个协调的写入块内部进行一些iCloud冲突解决.

当我的设备进入“spaz模式”时,这是在少数设备上反复打开和关闭应用程序的技术术语,会在内部抛出EXC_BAD_ACCESS异常.代码段:

- (void)compareVersionChanges:(NSFiLeversion *)version {
    if (![DataLoader iCloudPreferenceEnabled]) {
        NSLog(@"Ignoring iCloud changes (version comparison) based on user preference");
        return;
    }
    NSLog(@"compareVersionChanges");
    dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
    dispatch_async(aQueue,^(void) {
        NSError *readError = nil;
        NSFileCoordinator *coordinator = [[NSFileCoordinator alloc] initWithFilePresenter:(id)self];
        [coordinator coordinateReadingItemAtURL:[version URL] options:0 error:&readError byAccessor:^(NSURL *newURL) {
            DataContext *loadedContext = nil;
            NSData *data = [NSData dataWithContentsOfURL:newURL];
            NSError *e = nil;
            loadedContext = [self convertXmlDataToContext:data error:&e];
            if (E) {
                NSLog(@"Done loading,error: %@",E);
                [[DataLoader applicationDelegate] displayError:e];
                loadedContext = nil;
            }

            if (!loadedContext) {
                return;
            }

            id appDelegate = [DataLoader applicationDelegate];
            DataContext *inMemoryContext = nil;
            if (appDelegate != nil && [appDelegate respondsToSELEctor:@SELEctor(context)]) {
                inMemoryContext = [appDelegate performSELEctor:@SELEctor(context)];
            }

            if (inMemoryContext) {
                NSLog(@"Performing iCloud context synchronizaTing...");
                DataContextSynchronizer *synchronizer = [[DataContextSynchronizer alloc] init];
                ChangeSet *changes = [synchronizer compareLocalContext:inMemoryContext andRemoteContext:loadedContext];
                if ([[changes changes] count] > 0) {
                    [SELEctionManager disable];
                    @synchronized(appDelegatE) {
                        NSLog(@"Applying synchronization changes...");
                        [synchronizer applyChangeSet:changes toDataContext:inMemoryContext];
                        NSLog(@"Synchronization changes applied");
                    }
                    [SELEctionManager enable];
                    if ([appDelegate respondsToSELEctor:@SELEctor(setSkiprefreshSave:)]) {
                        [appDelegate performSELEctor:@SELEctor(setSkiprefreshSave:) withObject:[NSnumber numberWithBool:YES]];
                    }
                    dispatch_queue_t mainQueue = dispatch_get_main_queue();
                    dispatch_async(mainQueue,^(void) {
                        [SELEctionManager notifyListeners];
                    });
                    if ([appDelegate respondsToSELEctor:@SELEctor(setSkiprefreshSave:)]) {
                        [appDelegate performSELEctor:@SELEctor(setSkiprefreshSave:) withObject:[NSnumber numberWithBool:NO]];
                    }
                    [self save:[[DataLoader applicationDelegate] context]];
                } else {
                    NSLog(@"No sync changes applicable.");
                }
                NSError *coordinateWriteRemoveError = nil;
                [coordinator coordinateWriTingItemAtURL:newURL options:NSFileCoordinatorWriTingFordeleting error:&coordinateWriteRemoveError byAccessor:^(NSURL *theURL) {
                    theURL = [theURL copy];
                    NSError *removeOtherVersionsError = nil;
                    [NSFiLeversion removeOtherVersionsOfItemAtURL:theURL error:&removeOtherVersionsError];
                    if (removeOtherVersionsError) {
                        NSLog(@"Error removing other versions: %@",removeOtherVersionsError);
                    }
                }];
                if (coordinateWriteRemoveError) {
                    NSLog(@"Error occurred coordinaTing write for deletion of other file versions: %@",coordinateWriteRemoveError);
                }
            }
        }];


        if (readError) {
            NSLog(@"Done loading (outside block) error: %@",readError);
        }
    });
}

我认为一点语法高亮可能会使这更容易检查:

Link to image of code snippet and failure stack in Xcode

错误实际上发生在第1404行,正如您从下面的屏幕截图中看到的那样,它在Apple代码区域中很深.

Link to image of debugger

在提交雷达之前,我想我会在这里查看是否有什么我做错了?第1402行的额外[… copy]只是一个快速检查,以确保我没有丢失对块提供的参数的引用,并将被删除.

编辑:一个重要的说明!我正在使用ARC.

编辑2:我注意到在打电话时:

[NSFiLeversion otherVersionsOfItemAtURL:theURL]

返回值为nil,表示(通过文档):

因此,在调用removeOtherVersionsOfItemAtURL:之前检查此方法的返回值,可以缓解此问题.但我仍然觉得抛出EXC_BAD_ACCESS很奇怪,而不是正确处理它的方法.

解决方法

我注意到在打电话时:

[NSFiLeversion otherVersionsOfItemAtURL:theURL]

调用removeOtherVersionsOfItemAtURL:之前,返回值为nil,表示(通过文档):

因此,可以缓解此问题.但我仍然觉得奇怪的是,removeOtherVersionsOfItemAtURL:抛出EXC_BAD_ACCESS,而不是简单地返回NO的方法,或者只是填充提供的NSError对象.

我将提交雷达,当我收到回复时会在这里更新.

大佬总结

以上是大佬教程为你收集整理的objective-c – NSFileVersion调用期间EXC_BAD_ACCESS调用removeOtherVersionsOfItemAtURL:内部协调写入块全部内容,希望文章能够帮你解决objective-c – NSFileVersion调用期间EXC_BAD_ACCESS调用removeOtherVersionsOfItemAtURL:内部协调写入块所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。