我有两个视图控制器 A 和 B。从 A,我导航到视图控制器 B,如下所示:
// in View Controller A
// navigateToB method
-(void) navigateToB {
BViewController *bViewController =
[[BViewController alloc] initWithNibName: @"BView" bundle:nil];
bViewController.bProperty1 = SOME_STRING_CONSTANT;
bViewController.title = @"A TITLE OF A VC's CHOOSING";
[self.navigationController pushViewController: bViewController animated:YES];
[bViewController release]; //<----- releasing 0x406c1e0
}
在 BViewController 中,属性 bPropery1 的定义如下(注意,B 还包含 UITableView 等属性):
@property (nonatomic, copy) NSString *bProperty1;
在 A 和 B 之间来回导航时,一切似乎都工作正常。直到我将 UISearchDisplayController 添加到 BViewController 中包含的表视图中。现在,当我从 B 导航回到 A 时,应用程序崩溃了。
堆栈跟踪显示搜索显示控制器在崩溃时自动释放的情况:
#0 0x009663a7 in ___forwarding___
#1 0x009426c2 in __forwarding_prep_0___
#2 0x018c8539 in -[UISearchDisplayController _destroyManagedTableView]
#3 0x018c8ea4 in -[UISearchDisplayController dealloc]
#4 0x00285ce5 in NSPopAutoreleasePool
NSZombies 显示:
-[BViewController respondsToSelector:]: message sent to deallocated instance 0x406c1e0
并且这方面的 malloc 历史记录指向上面 A 的 navigatorToB 方法中已经释放的 bViewController:
Call [2] [arg=132]: thread_a065e720 |start ... <snip>
..._sendActionsForEvents:withEvent:] | -[UIControl sendAction:to:forEvent:] | -
[UIApplication sendAction:to:from:forEvent:] | -[**AViewController navigateToB**] |
+[NSObject alloc] | +[NSObject allocWithZone:] | _internal_class_createInstance |
_internal_class_createInstanceFromZone | calloc | malloc_zone_calloc
有人可以给我关于这里发生的事情的任何想法吗?在navigateToB方法中,一旦bViewController被释放(在pushViewController之后),bViewController就应该被释放。其他人甚至都不知道它,因为它是 navigatorToB 方法块的本地内容,而且它已经被释放了。
当从 B 导航回 A 时,viewDidLoad、viewWillAppear 等中不会调用任何会重新进入 navigatorToB 的内容。
看起来搜索显示控制器以某种方式引用了我的 AViewController 中的某些内容,因此当它自动释放时,它会将这个“某些内容”一起删除,但我无法理解这是怎么可能的,特别是当我使用副本来传递数据时A 和 B 之间。
我要为这件事上厕所了。我确信这是我在某个地方犯的错误,所以我向 Stack Overflow 的传奇人物寻求智慧之言或关于如何解决这个问题的建议。
非常感谢。