2011-07-16 64 views
3

我正在将iPhone应用程序转换为通用应用程序。我有一个NIB视图,我想在iPad上使用,但调整大小和定位。在iPhone上我与initWithNibName正常初始化...可以用你自己的initWithFrame初始化一个类吗?

EventEditViewController *eventEditViewController = [[EventEditViewController alloc] initWithNibName:@"EventEditViewController" bundle:nil]; 

我发现,这并没有为我在iPad上因为各种原因工作。所以,我在iPad上运行的时候......

EventEditViewController *eventEditViewControllerForIPad = [[EventEditViewController alloc] initWithFrame:iPadFrame eventDate:longDate event:eventName delegate:self]; 

这解决了几个问题创建了自己的初始化方法,改为调用。一个如何调整和定位我想要的视图以及如何正确地初始化某些变量。我实际上传递了比你在这里看到的更多的变量。

它工作得很好,但我现在才注意到,不像initWithNibName,viewDidLoad在我的initWithFrame方法之前触发。我只发现了这一点,因为我试图访问的变量viewDidLoad显示为一个僵尸,我想我正在初始化它在我的initWithFrame方法。

我对这种行为感到惊讶。这是正常的吗?对我来说,视图将在alloc/init调用中的namedMethod之前加载是没有意义的。

我现在想知道我在做什么可能不是一件好事。就像我说的那样工作得很好,但是我不应该在这里使用我自己的初始化方法吗?

如果可以这样做,也许有人可以解释为什么在init方法之前加载视图。

感谢,

约翰

回答

2

如果您-initWithFrame:...方法访问视图控制器的view财产,-viewDidLoad将调用init方法完成之前,因为view访问将导致加载视图。

至于是否可以使用自己的方法,只要您的init方法调用该类的指定初始值设定项就可以。

+0

啊。因此,我正在调整视图的大小和位置,必须先加载视图。编译时必须预先设置它,因为我现在已经看到我的initWithFrame实际上是首先调用的,但是一旦我调用指定的初始化程序,viewDidLoad就会运行,然后我的其余的initWithFrame代码就会运行。 – user278859

+0

右视图控制器在创建时通常不会加载视图。许多应用程序在启动时将创建六个视图控制器,但只有其中一个会立即显示其视图。正如@MugunthKumar写道,如果内存变得紧张,控制器视图也可以被卸载。因此,您应该避免访问'-init ...'中的'view'属性,而是在'-viewDidLoad'方法中执行与视图相关的任何必要配置。 – Caleb

1

初始化成员变量应该在viewDidLoad中或awakeFromNib来完成。 awakeFromNib是第一个当视图来自Xib时被调用的方法。

因为您可以在viewDidUnload中取消分配它们,所以最好使用viewDidLoad来分配巨大数组的内存。

当其他视图需要更多内存时,导航控制器和选项卡栏控制器都使用视图加载方法来卸载视图。

尽可能避免在其他方法中分配。

1

从苹果的PageControl源代码

// load the view nib and initialize the pageNumber ivar 
- (id)initWithPageNumber:(int)page 
{ 
    if (self = [super initWithNibName:@"MyView" bundle:nil]) 
    { 
     pageNumber = page; 
    } 
    return self; 
} 

您可以在EventEditViewController定义自己的自定义init方法,你可以使用像上面的自定义方法来初始化您的viewController,并设置尽可能多的成员变量,只要你想像iPadFrame,longDate,eventName等你的情况。

只要确保您完全按照上述方式调用它,因为在这种自定义init方法中调用超级实现非常重要。

此外,为了更清楚地说明您应该在哪里释放您在viewDidLoad方法中创建的数组,它首先是除了viewDidUnload之外的dealloc方法。背后的原因是viewDidUnload方法并不总是被调用。它仅在应用程序开始接收内存警告时才被调用。与此相比,当您释放初始化的viewController并且它的保留计数达到0时,dealloc方法会自动调用。您应该释放已初始化viewDidLoad方法的数组,并使用dealloc方法保留其他属性。

另外请记住,当应用程序收到内存警告时,它实际上是一个释放额外内存的机会。另外viewDidUnload方法被调用,用于内存中所有的viewControllers,当时除了可见的。

+0

谢谢,我只是调用[超级init]而不是[super initeWithNibName:bundle]。我改变了它。如果我可以检查2个答案,我会检查你的以及Caleb的下面。 – user278859

+0

没问题,我很高兴,如果我帮助!祝一切顺利。迦勒的回答是解决问题的方法。我的回答是其他方式,也许更好的方式来实现相同的东西:) – indiantroy

相关问题