Way*_*man 16 iphone uisearchdisplaycontroller uistoryboard
我有一个使用StoryBoards的项目,并UISearchDisplayController在a的上下文中使用UINavigationController,它出现在根视图控制器中.当我将一个新的视图控制器推入堆栈并导致模拟内存警告(或实际上得到一个低内存警告).上一个视图控制器成功卸载其视图.但是,当我从堆栈中弹出第二个视图控制器时,我得到了一个EXC_BAD_ACCESS.我打开了NSZombies并发现了这个:
[UISearchDisplayController retain]:发送到解除分配的实例0xb13aa30的消息
我不是(至少在我的代码中)将该消息发送给UISearchDisplayController.用编程方式说,我没有做任何事情.断点显示我甚至没有进入viewDidLoad第一个视图控制器.
但是好奇的是:对于笑声和咯咯笑声,我决定彻底retain改变我的SDC viewDidLoad,只是为了看看会发生什么,不会发生崩溃.但是,我的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)
Run Code Online (Sandbox Code Playgroud)
似乎没有任何真正有趣的东西(有吗?:P)并且似乎是苹果公司的所有内部成员.关于如何解决这个问题的任何想法?
更新:即使我删除了我的视图控制器和搜索显示控制器的属性之间的连接,但IBOutlet为它创建了自己的连接,它仍然崩溃.也许是坏虫?
更新2:当我以编程方式创建自己的UISearchDisplayController(不通过故事板)实例并创建它时viewDidLoad,一切都按预期的方式工作.
更新3:我能够在带有故事板的新项目中始终如一地重现此问题.我使用香草笔尖做了同样的事情,一切都按照它想象的方式工作.但是,如果我使用故事板和segue设置相同的东西,它会像在我的真实项目中一样爆炸.:(
RECAP:以下是重新创建此问题的步骤:
UISearchDisplayControllerviewDidLoad 在这一点上甚至没有调用第一个视图控制器,Apple的代码在此之前就会爆炸.
Way*_*man 12
这是我做的(授予,这是一个解决方法,而不是Apple的错误修复):
首先,在基础中UIViewController创建了一个名为的属性searchController:
@property (nonatomic, retain) IBOutlet UISearchDisplayController* searchController;
Run Code Online (Sandbox Code Playgroud)
我添加了一个UISearchBarin through界面构建器,以便在我的UI中有一个占位符.然后,在我viewDidLoad手动设置控制器并连接它:
UISearchDisplayController* searchController = [[UISearchDisplayController alloc]
initWithSearchBar:self.searchBar contentsController:self];
searchController.searchResultsDataSource = self;
searchController.searchResultsDelegate = self;
searchController.delegate = self;
self.searchController = searchController;
[searchController release];
Run Code Online (Sandbox Code Playgroud)
在我,viewDidUnload我一定要清除它:
self.searchController = nil;
Run Code Online (Sandbox Code Playgroud)
Way*_*Liu 11
到目前为止,我发现这个使用ARC的iOS 5 SDK工作解决方案:
在.h文件中,使用IBOutlet声明自己的searchDisplayController属性
@property (strong, nonatomic) IBOutlet UISearchDisplayController * searchDisplayController;
Run Code Online (Sandbox Code Playgroud)
然后在.m文件中,合成它:
@synthesize searchDisplayController;
Run Code Online (Sandbox Code Playgroud)
但是不要在viewDidUnload中将其设置为nil.
这样搜索显示控制器将使用您创建的属性而不是使用继承的属性.
我还注意到手势识别器也会出现类似的错误(如果您从故事板创建手势识别器而不是以编程方式创建它们).我们还需要创建STRONG手势识别器属性,并将它们与您在storyboard中创建的手势识别器对象挂钩.然后在viewDidUnload中,不要将它们设置为nil.< - 这可以防止崩溃.
| 归档时间: |
|
| 查看次数: |
3924 次 |
| 最近记录: |