gpt4 book ai didi

crash - UINavigationController 由于推送和弹出 UIViewController 而崩溃

转载 作者:行者123 更新时间:2023-12-03 15:52:55 25 4
gpt4 key购买 nike

问题:
我有一个 UINavigationController 作为 UIWindow 的 subview 、一个 rootViewController 类和一个自定义 MyViewController 类。以下步骤将获得 Exc_Bad_Access,100% 可重现。:

[myNaviationController pushViewController:myViewController_1stInstance animated:YES];
[myNaviationController pushViewController:myViewController_2ndInstance animated:YES];

点击左回 tapBarItem 两次(弹出两个 myViewController 实例)以显示 rootViewController。

经过 1/2 天的痛苦尝试和错误,我终于找到了答案,但也提出了一个问题。

解决方案:我将 .m 文件中的许多对象声明为声明私有(private)变量的一种惰性方式,以避免使 .h 文件困惑。例如,
#impoart "MyViewController.h"
NSMutableString*variable1;

@implement ...

-(id)init
{
...
varialbe1=[[NSMutableString alloc] init];
...
}

-(void)dealloc
{
[variable1 release];
}

由于某些原因,当加载 myViewController_2ndInstance 的 View 后卸载 myViewController_1stInstance 的 View (但仍在导航 Controller 的堆栈中)时,iphone OS 可能会丢失这些“惰性私有(private)”变量内存分配的跟踪。由于 myViewController_2ndInstance'view 仍然加载,第一次点击后面的 tapBarItem 是可以的。但是第二次点击后面的 tapBarItem 给了我 hell ,因为它试图释放第一个实例。它称为 [variable release] 导致 Exc_Bad_Access 因为它随机指向(松散的指针)。

要解决这个问题很简单,在 .h 文件中将 variable1 声明为 @private。

这是我的问题:
在涉及 UINavigationController 之前,我一直在使用“惰性私有(private)”变量很长一段时间没有任何问题。这是 iPhone OS 中的错误吗?还是我对 Objective C 存在根本性的误解?

最佳答案

它可能与使用相同静态分配变量的 View Controller 的两个实例有关。

换句话说,myViewController_1stInstancemyViewController_2ndInstance使用相同的variable1内存中的位置并相互覆盖。

在您的 @interface 之后在花括号内声明的变量定义具有由运行时为类的每个实例分配的内存位置(每次调用 [<ClassName> alloc] 。在全局范围内(即在任何函数或类声明之外)声明的变量就是:全局。这意味着每个运行的应用程序副本该变量只能保存一个值。

Objective-C 中没有真正的私有(private)变量,但您可以在编译时将它们隐藏在其他实例中,如 here 所述。 .

关于crash - UINavigationController 由于推送和弹出 UIViewController 而崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2807301/

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