我正在尝试使用URLByResolvingBookmarkData
来检索存储的安全范围书签,但是遇到了问题。
我正在使用将函数调用包装在NSAutoreleasePool
中的第三方库(wxWidgets)。一切似乎都可以正常工作,除了释放该池时,我在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
,但效果相同。)