Objective-C iOS开发在设置variables时使用viewDidLoad或initWithCoder,为什么?

所以看来我应该在viewDidLoad设置我的成员variables – 但我很困惑,为什么在initWithCoder设置这些variables失败,因为都在程序的开始时被调用。

特别是我有一行代码:

 [worldView setMapType:MKMapTypeSatellite]; 

其中worldView是一个IBOutlet MKMapView对象。 它在viewDidLoad下工作,但不是initWithCoder

当调用initWithCoder时,这些对象还不存在,并且在调用viewDidLoad时它们会执行。 检查你的initWithCoder方法,通过注销worldView的值使用类似的东西:

 NSLog(@"World View: %@", worldView); 

这将是nil 。 在调用viewDidLoad之前,它们将被初始化,所以你可以在那里设置那个IBOutlet的属性。

调用initWithCoder时,sockets还没有连接。 从文档 :

在实例化过程中,归档中的每个对象都被解除存档,然后使用适合其types的方法进行初始化。 符合NSCoding协议(包括UIViewUIViewController所有子类)的对象使用它们的initWithCoder:方法进行初始化。

在所有对象被实例化和初始化之后,nib加载代码重新build立所有这些对象的出口和动作连接。 然后调用对象的awakeFromNib方法。

所以awakeFromNib将是一个适合自定义UI元素设置的地方。