gpt4 book ai didi

ios - ARC ViewController 被释放

转载 作者:行者123 更新时间:2023-11-29 12:54:44 25 4
gpt4 key购买 nike

我有一个显示按钮的 View Controller 。当我点击按钮时,需要调用相应的选择器。但是,对于 ARC,应用程序崩溃并显示 EXC_BAD_ACCESS 消息。

-(IBAction)reseauPushed:(id)sender{
self.reseauVC = [[ReseauVCIpad alloc]initWithNibName:@"ReseauVCIpad" bundle:nil];
[self.viewCenter addSubview:self.reseauVC.view];
}

  @property (strong, nonatomic) ReseauVCIpad *reseauVC;

和崩溃日志:

 -[ReseauVCIpad performSelector:withObject:withObject:]: message sent to deallocated instance

我使用 ARC。按钮 Action :

-(IBAction)helloPushed:(id)sender{
NSLog("hello);
}

最佳答案

这个 ReseauVCIpad View Controller 显然正在以某种方式被释放。要么你不小心将 self.reseauVC 设置为 nil 某个地方,要么更可能的是,父 View Controller 本身以某种方式被释放。您是否有机会为前面的任何 View Controller 执行此 addSubview 技术?如果没有,您是如何实例化 Root View Controller 的?

要诊断问题出在哪里,我建议您将 dealloc 方法添加到所有不同的 View Controller ,以便您可以确认是否有任何 View Controller 过早释放。 (设置断点或放入 NSLog 语句。)我敢打赌,您会看到 ReseauVCIpad 的父级被释放,这反过来又允许 ReseauVCIpad 本身将被释放。


顺便说一下,正如其他人所指出的,这个问题的典型答案是确保您正在执行适当的包含调用(如下所示),或者如果这个 subview Controller 占据了整个屏幕,您应该只是插入它或模态呈现它。显然,您有一个对 ReseauVCIpadstrong 引用,因此缺少包含调用并不是 ReseauVCIpad 本身问题的根源(尽管我想知道您是否正在使用一个或多个 ReseauVCIpad 的父 View Controller 执行此 addSubview 技巧而没有包含调用)。

但无论如何,您仍然应该进行这些包含调用(或进行适当的模式/推送转换),以确保您的 View Controller 层次结构与您的 View 层次结构保持同步(请参阅 WWDC 2011 视频 Implementing UIViewController Containment 详细讨论为什么这很重要)。添加带有自己的 Controller 的 subview 的适当包含调用至少如下所示:

- (IBAction)reseauPushed:(id)sender
{
self.reseauVC = [[ReseauVCIpad alloc]initWithNibName:@"ReseauVCIpad" bundle:nil];
[self addChildViewController:self.reseauVC];
[self.viewCenter addSubview:self.reseauVC.view];
[self.reseauVC didMoveToParentViewController:self];
}

有关更详细的说明,请参阅我在上面引用的视频,或参阅 Creating Custom Container View Controllers iOS View Controller 编程指南部分。

当你想删除它时,你也应该在那里进行适当的包含调用:

- (void)removeReseau
{
[self.reseauVC willMoveToParentViewController:nil];
[self.reseauVC.view removeFromSuperview];
[self.reseauVC removeFromParentViewController];
self.reseau = nil;
}

这通常可以解决这个问题( subview Controller 被释放)。它不会解决您的 reseauVC 问题(因为您已经拥有强大的引用),但是 (a) 无论您使用 View Controller 执行 addSubview ,您都应该这样做,无论如何; (b) 如果您在别处执行 addSubview 而没有维护强引用,我会向您展示该模式。

关于ios - ARC ViewController 被释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21439130/

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