首页 > 解决方案 > objc_release 中的 EXC_BAD_ACCESS(由于 URLByResolvingBookmarkData?)

问题描述

我正在尝试使用URLByResolvingBookmarkData来检索存储的安全范围的书签,但我遇到了问题。

我正在使用将函数调用包装在NSAutoreleasePool. 一切似乎都很好,除非该池被释放时,我在EXC_BAD_ACCESS中崩溃objc_release,特别是:

frame #0: 0x00007fff7b2d4184 libobjc.A.dylib objc_release + 36
frame #1: 0x00007fff7b2d5087 libobjc.A.dylib (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 817
frame #2: 0x00007fff540aaa56 CoreFoundation _CFAutoreleasePoolPop + 22
frame #3: 0x00007fff561e7b56 Foundation -[NSAutoreleasePool release] + 144
...

我已将其缩小到这部分代码:

NSData *bookmarkData = [NSData dataWithBytes:data length:len];

NSURL *url = [NSURL URLByResolvingBookmarkData:bookmarkData
        options:NSURLBookmarkResolutionWithSecurityScope
        relativeToURL:nil
        bookmarkDataIsStale:&bookmarkDataIsStale
        error:&error];

如果我之前返回URLByResolvingBookmarkData,或者如果我将其更改为NSURL *url = [[NSURL alloc] init],一切正常:可以释放池而不会崩溃。(我的意思是,它不能正常工作,因为书签没有被解析,但至少它不会崩溃。)

事实上,我有一个相同的应用程序的非沙盒构建,它在其他方面是相同的(非沙盒,它不使用这段特定的代码,所以它只是#ifdef被淘汰了)并且运行没有问题。

我在使用中有什么明显愚蠢的事情URLByResolvingBookmarkData吗?(我也试过initByResolvingBookmarkData同样的效果。)

标签: objective-cwxwidgetsnsurlappstore-sandboxnsautoreleasepool

解决方案


推荐阅读