【问题标题】:Presenting a non-arc ViewController from within an arc ViewController从弧视图控制器中呈现非弧视图控制器
【发布时间】:2013-01-21 03:49:35
【问题描述】:

-- 集成到主应用程序后更新的名称和添加的回溯--

我有一个简单的 iOS 应用程序,它由两个控制器组成:

  1. 不使用 ARC 的 BXDemoViewController。
  2. TestViewController 使用 ARC

我正在尝试使用以下代码从 TestViewController 中呈现 BXDemoViewController 在触摸 UIButton 时调用:

-(IBAction) invokeScanner: (id)sender {
    BXDemoViewController * scannerController = [[BXDemoViewController alloc] init];
    [self presentViewController:scannerController animates:YES completion:nil];
}

控制器被正确调用并且运行良好,但是当dismissViewControllerAnimated时: 被调用我得到一个 EXEC_BAD_ACCESS。将呈现控制器 (TestViewController) 转换为 非 ARC 代码摆脱了向我暗示它与我的方式有关的问题 分配和使用 BXDemoViewController 但我想将 TestViewController 保留在 ARC 中。

我对 iOS 开发比较陌生,我有限的知识告诉我,我想以某种方式 桥接 BXDemoViewController,因为它是在 ARC 控制源中调用的,但我不知道如何。

任何帮助将不胜感激。

回溯输出:

thread #1: tid = 0x2503, 0x32d5f5b0 libobjc.A.dylib`objc_msgSend + 16, stop reason = EXC_BAD_ACCESS (code=1, address=0x8002b192)
frame #0: 0x32d5f5b0 libobjc.A.dylib`objc_msgSend + 16
frame #1: 0x31df0b5e CoreFoundation`+[__NSArrayI __new:::] + 58
frame #2: 0x31df03b6 CoreFoundation`-[__NSPlaceholderArray initWithObjects:count:] + 270
frame #3: 0x39682fe6 UIKit`-[UIView dealloc] + 98
frame #4: 0x32d61488 libobjc.A.dylib`(anonymous namespace)::AutoreleasePoolPage::pop(void*) + 168
frame #5: 0x31de9440 CoreFoundation`_CFAutoreleasePoolPop + 16
frame #6: 0x31e79f40 CoreFoundation`__CFRunLoopRun + 1296
frame #7: 0x31decebc CoreFoundation`CFRunLoopRunSpecific + 356
frame #8: 0x31decd48 CoreFoundation`CFRunLoopRunInMode + 104
frame #9: 0x39bea2ea GraphicsServices`GSEventRunModal + 74
frame #10: 0x396a82f8 UIKit`UIApplicationMain + 1120
frame #11: 0x00002296 BXDemo`main + 90 at main.m:15

thread #3: tid = 0x2903, 0x31084648 libsystem_kernel.dylib`kevent64 + 24
frame #0: 0x31084648 libsystem_kernel.dylib`kevent64 + 24
frame #1: 0x344a54f0 libdispatch.dylib`_dispatch_mgr_invoke + 796
frame #2: 0x34497df8 libdispatch.dylib`_dispatch_mgr_thread$VARIANT$up + 36

thread #5: tid = 0x2b03, 0x31083eb4 libsystem_kernel.dylib`mach_msg_trap + 20
frame #0: 0x31083eb4 libsystem_kernel.dylib`mach_msg_trap + 20
frame #1: 0x3108404c libsystem_kernel.dylib`mach_msg + 40
frame #2: 0x31e7b044 CoreFoundation`__CFRunLoopServiceMachPort + 128
frame #3: 0x31e79da2 CoreFoundation`__CFRunLoopRun + 882
frame #4: 0x31decebc CoreFoundation`CFRunLoopRunSpecific + 356
frame #5: 0x31decd48 CoreFoundation`CFRunLoopRunInMode + 104
frame #6: 0x36148a44 WebCore`RunWebThread(void*) + 444
frame #7: 0x344df310 libsystem_c.dylib`_pthread_start + 308
frame #8: 0x344df1d8 libsystem_c.dylib`thread_start + 8

thread #6: tid = 0x2427, 0x3109408c libsystem_kernel.dylib`__psynch_cvwait + 24
frame #0: 0x3109408c libsystem_kernel.dylib`__psynch_cvwait + 24
frame #1: 0x344d7d2e libsystem_c.dylib`_pthread_cond_wait + 646
frame #2: 0x344e1f18 libsystem_c.dylib`pthread_cond_wait + 40
frame #3: 0x381f39a8 CoreMedia`FigSemaphoreWaitRelative + 260
frame #4: 0x3499035a MediaToolbox`fpa_AsyncMovieControlThread + 26
frame #5: 0x3821198a CoreMedia`figThreadMain + 194
frame #6: 0x344df310 libsystem_c.dylib`_pthread_start + 308
frame #7: 0x344df1d8 libsystem_c.dylib`thread_start + 8

thread #9: tid = 0x2e03, 0x000aa468 BXDemo`BitmapIsPixelOn(tagBITMAP const&, long, long) + 60
frame #0: 0x000aa468 BXDemo`BitmapIsPixelOn(tagBITMAP const&, long, long) + 60
frame #1: 0x000a9df2 BXDemo`PointMoveTillOffNoisy(tagPOINT&, Direction, tagBITMAP&, long, long) + 290
frame #2: 0x0007f966 BXDemo`ReaderDataMatrix::FindBarcodeBoundaries(tagBITMAP&, tagPOINT, tagPOINT, _BCDM*, signed char) + 3278
frame #3: 0x0007df6c BXDemo`ReaderDataMatrix::DMBarcodeRecognition(BarcodeReaderInfo&, tagBITMAP&) + 324
frame #4: 0x0007de08 BXDemo`ReaderDataMatrix::Recognize(BarcodeReaderInfo&, tagBITMAP&, BarcodeResultList&) + 236
frame #5: 0x000abba2 BXDemo`BarcodeReader::PerformRecognition(tagBITMAP&) + 686
frame #6: 0x000ab858 BXDemo`BarcodeReader::AnalyzeBarcode(ImageBase*, long, long*) + 112
frame #7: 0x000ab186 BXDemo`BXiOSAPI::recognize(void const*, int, int, long, long, bool, IOSResult&) + 398
frame #8: 0x000af860 BXDemo`-[BXRuntime RecognizeImage:width:height:stride:result:] + 244 at BXRuntime.mm:630
frame #9: 0x000ae2ee BXDemo`-[BXRuntime recognizeData:] + 234 at BXRuntime.mm:215
frame #10: 0x000b11cc BXDemo`-[BXThreadQueue dispatchThread:] + 296 at BXThreadQueue.mm:133
frame #11: 0x33a9067c Foundation`__NSThread__main__ + 972
frame #12: 0x344df310 libsystem_c.dylib`_pthread_start + 308
frame #13: 0x344df1d8 libsystem_c.dylib`thread_start + 8

thread #10: tid = 0x2f03, 0x344d489c libsystem_c.dylib`start_wqthread
frame #0: 0x344d489c libsystem_c.dylib`start_wqthread

【问题讨论】:

  • 问题在于您的BSViewControllerdealloc 方法。请在此处设置一个断点并检查。可能您正在那里释放一些未初始化的对象。与ARC无关。如果您使用的是非弧,您是否在呈现后释放了该对象?
  • 能否显示控制台输出
  • 我建议 (a) 通过静态分析器运行您的代码(shift-command-B 或从“产品”菜单中选择“分析”;以及 (b) 为所有异常类型。但我认为问题不在于问题的代码,而在于其他地方(例如,BSViewController 的分配中有问题,只有在BSViewController 被解除分配后才表现出来)。没有看到更多的代码,无法分辨。
  • 大家好。感谢您的帮助。 Midhun MP:我之前尝试在BXDemoViewController的dealloc处下断点,它经历了所有的releases和dealloc的超精细。我也只是尝试在不使用 ARC 的情况下在演示后释放控制器。它似乎导致了同样的问题。已为从异常断点接收的输出添加了回溯。另外,为了稍后澄清,使用僵尸不是一个选项,因为控制器使用相机预览。

标签: iphone ios objective-c automatic-ref-counting


【解决方案1】:

使用以下方法将非弧视图控制器转换为弧控制器

Targets->Compiler Sources->双击添加的非ARC Viewcontroller的.m文件,并给出标志为-fno-objc-arc。现在它可以正常工作了。

【讨论】:

  • 嘿乌玛。感谢您尝试提供帮助。但是,我之前尝试过进行转换,但没有运气。再次,在关闭 BS 控制器时收到 EXEC_BAD_ACCESS。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-27
  • 1970-01-01
相关资源
最近更新 更多