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

时间:2011-10-28 06:31:56

标签: ios

我觉得这很奇怪,但同样的代码在我的其他应用程序中运行正常所以,我在iphone app委托中重写我的功能,它继承了作为主代表的超级类

       * .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错误

2 个答案:

答案 0 :(得分:0)

您没有初始化视图控制器。 iOS为视图控制器分配了空间,但您没有对其进行初始化。

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

你为什么打电话给[super.window addSubview:login_view.view];  而不是[window addSubview:login_view.view];

appDelegate的超级是NSObject,它没有窗口属性。

答案 1 :(得分:0)

首先,使用内置模板及其nib文件通常会使所有这些变得更加简单,我强烈建议不要尝试以这种方式构建它。那就是说,让我们来谈谈正在发生的事情。

您正在创建一个视图控制器,然后将其视图移出并将其放入窗口中。然后你扔掉视图控制器,它正确地解除分配。我不知道你会在哪里调用UITextField.text,但是当这个方法完成时,视图控制器就应该消失了。如果要保持视图控制器,则需要将其放在ivar中。

正如@Cyupa所说,你不应该在这里使用super.window。您应该使用self.window,但理想情况下,如果可以的话,您应该使用其中一个模板。