在微软的WinObjC UIApplication.mm文件(at https://github.com/Microsoft/WinObjC/blob/master/Frameworks/UIKit/UIApplication.mm)中,init方法是为UIApplication和WOCDisplayMode实现的。
类的init方法既不调用[super init],也不调用最终会导致调用[super init]的方法家族中的任何方法。除了NSProxy对象的初始化之外,我以前从未见过这种情况。
下面我已经复制了WOCDisplayMode的实现,以供参考。
-(instancetype) init
{
_fixedWidth = 320.0f;
_fixedHeight = 480.0f;
_fixedAspectRatio = 0.0f;
_magnification = 1.0f;
_autoMagnification = TRUE;
_sizeUIWindowToFit = TRUE;
_operationMode = WOCOperationModePhone;
return self;
}在我看来,这可能会造成一些问题;例如,如果UIApplication的一个超类(如UIResponder )在某个时候覆盖了init本身,并建立了未来方法调用所依赖的内部状态。
为什么实现者会选择不调用[super init]?这是一个合理的决定吗?它曾经是正确的吗?
发布于 2015-08-07 07:00:27
这显然是代表这些类的作者的错误。
NSProxy不调用[super init],因为它是一个抽象超类,不从NSObject继承。
由于它们的UIApplication实现继承自UIResponder,而WOCDisplayMode继承自NSObject,因此它们应该在这些类中调用[super init]。
根据Object Initialization上的文档
作为第一个操作调用超类的初始化程序的要求是很重要的。回想一下,一个对象不仅封装了它的类定义的实例变量,还封装了它的所有祖先类定义的实例变量。通过调用super的初始化器,可以帮助确保继承链上的类定义的实例变量首先被初始化。立即超类在其初始化项中调用其超类的初始化程序,该类调用主init.方法的超类,等等(参见图6-1)。正确的初始化顺序至关重要,因为子类的后期初始化可能取决于超类定义的实例变量被初始化为合理的值。
我建议把它作为项目的一个问题来记录。
https://stackoverflow.com/questions/31871381
复制相似问题