繁体   English   中英

无法释放视图控制器/导致EXC_BAD_ACCESS

[英]Not able to release view Controller/ cause EXC_BAD_ACCESS

我认为这很奇怪,但是相同的代码在其他应用程序中对我来说很好用,所以,我在继承了作为主委托的Super类的iphone应用程序委托中重写了我的函数

       * .appdelegate_iPhone.h *
        @interface AppDelegate_iPhone : AppDelegate 
        {

        }

        @end

    * .appdelegate_iPhone.m *
........

        - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
        {
          LoginViewController_iPhone * login_view = [[LoginViewController_iPhone alloc] initWithNibName:@"LoginViewController_iPhone" bundle:nil];
                [super.window addSubview:login_view.view];
                [super.window makeKeyAndVisible];
               //[login_view release];


            // Override point for customization after application launch.
            [self.window makeKeyAndVisible];
            return YES;

        }
......
@end

如您所见,我注释掉了释放login_view的原因,因为如果我不释放对象,那么之后我将无法控制任何IBoutlet UIField。

我的意思是,如果我释放login_view并尝试使用UITextField.text,我会得到exc_bad_access错误

您没有初始化视图控制器。 iOS为视图控制器分配了空间,但尚未初始化。

LoginViewController_iPhone * login_view  = [[LoginViewController_iPhone alloc] init];

为什么要调用[super.window addSubview:login_view.view]; 而不是[window addSubview:login_view.view];

appDelegate的超级对象是NSObject ,它没有window属性。

首先,使用内置模板及其nib文件通常会使所有这些操作变得更加简单,我强烈建议您这样做,而不是尝试以此方式进行构建。 也就是说,让我们谈谈正在发生的事情。

您正在创建一个视图控制器,然后将其视图取出并放入窗口中。 然后,您将丢弃正确分配的视图控制器。 我不知道您将在哪里调用UITextField.text ,但是在此方法完成时,视图控制器应该已经消失了。 如果要保留视图控制器,则需要将其放在ivar中。

如@Cyupa所述,您不应在此处使用super.window 您应该使用self.window ,尽管理想情况下,如果可以的话,应该使用其中一个模板。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM