此问题或类似问题之前已在此处讨论过,但我找不到任何可行的解决方案。
我使用以下代码在启用ARC的iOS 7项目上显示UIDocumentInteractionController
:
- (void) exportDoc{
// [...]
docController = [UIDocumentInteractionController interactionControllerWithURL:[NSURL fileURLWithPath:path]];
docController.delegate = self;
[docController presentOpenInMenuFromBarButtonItem:mainMenuButton animated:YES];
}
首先,我并不想创建一个包含控制器参考的属性,但是很多人都说它没有替代品。它被定义为
@property (strong) UIDocumentInteractionController* docController;
exportDoc
使用NSOperationQueue
在主线程中运行。无论何时执行,我都会收到以下错误消息:
由于未捕获的异常终止应用程序' NSGenericException', 原因:' - [UIPopoverController dealloc]到达,而popover仍然是 。可见'
这就是回溯所说的:
(lldb) bt * thread #1: tid = 0x1c97d9, 0x000000019a23c1c0 libobjc.A.dylib`objc_exception_throw, queue = 'com.apple.main-thread', stop reason = breakpoint 2.1 frame #0: 0x000000019a23c1c0 libobjc.A.dylib`objc_exception_throw frame #1: 0x000000018d982e90 CoreFoundation`+[NSException raise:format:] + 128 frame #2: 0x0000000190bc348c UIKit`-[UIPopoverController dealloc] + 96 frame #3: 0x0000000190e18fc8 UIKit`-[UIDocumentInteractionController dealloc] + 168 frame #4: 0x000000019a255474 libobjc.A.dylib`(anonymous namespace)::AutoreleasePoolPage::pop(void*) + 524 frame #5: 0x000000018d881988 CoreFoundation`_CFAutoreleasePoolPop + 28 frame #6: 0x000000018e42cb18 Foundation`-[__NSOperationInternal _start:] + 892 frame #7: 0x000000018e4eea38 Foundation`__NSOQSchedule_f + 76 frame #8: 0x000000019a813fd4 libdispatch.dylib`_dispatch_client_callout + 16 frame #9: 0x000000019a8171dc libdispatch.dylib`_dispatch_main_queue_callback_4CF + 336 frame #10: 0x000000018d942c2c CoreFoundation`__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 12 frame #11: 0x000000018d940f6c CoreFoundation`__CFRunLoopRun + 1452 frame #12: 0x000000018d881c20 CoreFoundation`CFRunLoopRunSpecific + 452 frame #13: 0x0000000193511c0c GraphicsServices`GSEventRunModal + 168 frame #14: 0x00000001909b2fdc UIKit`UIApplicationMain + 1156 * frame #15: 0x000000010000947c MyApplication`main(argc=1, argv=0x000000016fdfbc80) + 108 at main.m:16 frame #16: 0x000000019a82faa0 libdyld.dylib`start + 4
据我所知,autoreleasepool只是释放控制器。难道不能像我一样使用强大的财产来阻止这种情况吗?
你知道问题是什么以及如何解决它?
[编辑]
我禁用了ARC并手动添加了[docController retain]
并让它运行起来。我想知道我的项目是否真的启用了ARC并尝试了以下预处理器代码
#if !__has_feature(objc_arc)
#error no arc
#endif
但不显示错误。
答案 0 :(得分:0)
看起来像你正在使用的docController是一个局部变量而不是一个类级变量。当您使用局部变量时,它将被取消分配。您是否尝试使用该属性而不是iVar,如下所示。
- (void) exportDoc{
// [...]
self.docController = [UIDocumentInteractionController interactionControllerWithURL:[NSURL fileURLWithPath:path]];
self.docController.delegate = self;
[self.docController presentOpenInMenuFromBarButtonItem:mainMenuButton animated:YES];
}