initialize方法在类第一次接收消息时会被调用,而且只会调用一次,不使用类时,该方法不会被调用,下面来证明下这个问题
在工程中新建一个WPPerson类,实现initialize方法,然后在main方法中啥也不干,运行app,可以看到WPPerson中的initialize方法没有走
然后用WPPerson调用alloc方法,在WPPerson的initialize方法中打上断点,运行app,打印下当前的函数调用栈
可以看到对WPPerson发送消息时会自动调用initialize方法,函数调用栈中objc_msgSend的方法实现苹果是使用的汇编(由于这个方法调用比较频繁,所以苹果采取汇编的形式来实现),不过可以看出紧接着调用了lookUpImpOrForward方法,这时候打开objc源码,搜索这个方法
上图可以看出是个递归调用,先调用父类的initialize,父类调用完后再调用自己的initialize方法,而且是通过objc_msgSend方法进行调用
所以当子类第一次触发objc_msgSend时会先调用父类的initialize方法,然后再调用自己的initialize方法,只会调用一次
有时候父类的initialize方法会被调用多次,这是由于当子类没有实现initialize方法时,会先调用父类的initialize方法(第一次),然后再调用自己的initialize方法,由于是通过obj_msgSend消息机制调用,通过isa找到类对象,如果没有则去父类中查找,找到再调用(第二次)。
网友评论