gpt4 book ai didi

iphone - UISearchDisplayController 在 vi​​ewDidUnload 后导致崩溃

转载 作者:行者123 更新时间:2023-12-03 18:21:25 27 4
gpt4 key购买 nike

我有一个使用 StoryBoards 的项目,并且在 UINavigationController 的上下文中使用 UISearchDisplayController,它出现在 Root View Controller 中。当我将新的 View Controller 插入堆栈时,会导致模拟内存警告(或实际上收到内存不足警告)。先前的 View Controller 已成功卸载其 View 。但是,当我从堆栈中弹出第二个 View Controller 时,我得到一个 EXC_BAD_ACCESS。我打开 NSZombies 并发现了这一点:

[UISearchDisplayController retain]: message sent to deallocated instance 0xb13aa30

我没有(至少在我的代码中)将该消息发送到 UISearchDisplayController。从程序上来说,我没有用它做任何事情。断点显示我什至没有将其放入第一个 View Controller 的 viewDidLoad 中。

不过,有些奇怪的是:为了笑声和咯咯笑,我决定在我的 viewDidLoad 中完全保留 SDC,只是为了看看会发生什么并且不会发生崩溃。但是,我的 UISearchDisplayController 实例是 nil

我做了回溯并得到了这个输出:

#0  0x01e30e1e in ___forwarding___ ()
#1 0x01e30ce2 in __forwarding_prep_0___ ()
#2 0x01dd1490 in CFRetain ()
#3 0x01eb69c0 in +[__NSArrayI __new::] ()
#4 0x01e0a00a in -[__NSPlaceholderArray initWithObjects:count:] ()
#5 0x01e34f52 in +[NSArray arrayWithObjects:count:] ()
#6 0x01e5e084 in -[NSDictionary allValues] ()
#7 0x01035272 in -[UINib instantiateWithOwner:options:] ()
#8 0x00edce2c in -[UIViewController _loadViewFromNibNamed:bundle:] ()
#9 0x00edd3a9 in -[UIViewController loadView] ()
#10 0x00edd5cb in -[UIViewController view] ()
#11 0x00edd941 in -[UIViewController contentScrollView] ()
#12 0x00eef47d in -[UINavigationController _computeAndApplyScrollContentInsetDeltaForViewController:] ()
#13 0x00eef66f in -[UINavigationController _layoutViewController:] ()
#14 0x00eef93b in -[UINavigationController _startTransition:fromViewController:toViewController:] ()
#15 0x00ef03df in -[UINavigationController _startDeferredTransitionIfNeeded] ()
#16 0x00ef16cb in _popViewControllerNormal ()
#17 0x00ef196c in -[UINavigationController _popViewControllerWithTransition:allowPoppingLast:] ()
#18 0x0b446e82 in -[UINavigationControllerAccessibility(SafeCategory) _popViewControllerWithTransition:allowPoppingLast:] ()
#19 0x00ef0b10 in -[UINavigationController popViewControllerAnimated:] ()
#20 0x00ef297d in -[UINavigationController navigationBar:shouldPopItem:] ()
#21 0x00e7dabe in -[UINavigationBar _popNavigationItemWithTransition:] ()
#22 0x00e7da49 in -[UINavigationBar popNavigationItemAnimated:] ()
#23 0x0b42208c in -[UINavigationBarAccessibility(SafeCategory) popNavigationItemAnimated:] ()
#24 0x00e80507 in -[UINavigationBar _handleMouseUpAtPoint:] ()
#25 0x00e8074c in -[UINavigationBar touchesEnded:withEvent:] ()
#26 0x00e3fa30 in -[UIWindow _sendTouchesForEvent:] ()
#27 0x00e3fc56 in -[UIWindow sendEvent:] ()
#28 0x00e26384 in -[UIApplication sendEvent:] ()
#29 0x00e19aa9 in _UIApplicationHandleEvent ()
#30 0x02d37fa9 in PurpleEventCallback ()
#31 0x01e9e1c5 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ ()
#32 0x01e03022 in __CFRunLoopDoSource1 ()
#33 0x01e0190a in __CFRunLoopRun ()
#34 0x01e00db4 in CFRunLoopRunSpecific ()
#35 0x01e00ccb in CFRunLoopRunInMode ()
#36 0x02d36879 in GSEventRunModal ()
#37 0x02d3693e in GSEventRun ()
#38 0x00e17a9b in UIApplicationMain ()
#39 0x00002b72 in main (argc=1, argv=0xbffff620)

那里似乎没有任何真正有趣的东西(有过吗?:P),而且似乎都是苹果公司内部的东西。关于如何解决这个问题有什么想法吗?

更新:即使我删除了 View Controller 与搜索显示 Controller 的属性之间的连接,但为其创建了自己的 IBOutlet,它仍然会崩溃。也许是坏错误?

更新2:当我以编程方式创建自己的UISearchDisplayController实例(不是通过 Storyboard)并在viewDidLoad中创建它时,一切按照预期的方式工作。

更新 3:我能够在带有 Storyboard的新项目中一致地重现此问题。我用 Vanilla Nib 做了同样的事情,一切都按照预期的方式进行。然而,如果我使用 Storyboard和转场设置相同的东西,它就会像在我的真实项目中一样爆炸。 :(

回顾:以下是重现此问题的步骤:

  1. 使用 UISearchDisplayController 在 Storyboard中创建 View Controller
  2. 在导航堆栈上推送新的 View Controller
  3. 导致内存不足警告
  4. 将 Controller 从堆栈中弹出
  5. 轰隆隆!

viewDidLoad 此时甚至没有在第一个 View Controller 上被调用,Apple 的代码在此之前就崩溃了。

最佳答案

这是我所做的(当然,这是一种解决方法,而不是针对 Apple 错误的修复):

首先,在基本 UIViewController 中,我创建了一个名为 searchController 的属性:

@property (nonatomic, retain) IBOutlet UISearchDisplayController* searchController;

我通过界面生成器添加了一个 UISearchBar ,以便我的 UI 中有一个占位符。然后,在我的 viewDidLoad 中,我手动设置 Controller 并连接它:

UISearchDisplayController* searchController = [[UISearchDisplayController alloc] 
initWithSearchBar:self.searchBar contentsController:self];
searchController.searchResultsDataSource = self;
searchController.searchResultsDelegate = self;
searchController.delegate = self;

self.searchController = searchController;
[searchController release];

在我的viewDidUnload中,我确保将其清除:

self.searchController = nil;

关于iphone - UISearchDisplayController 在 vi​​ewDidUnload 后导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8567525/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com