最近在研究基础的一些东西,发现什么都不做,用xcode9.1创建的项目会自带sb,然后想看一下到底程序是如何执行的,就在每个方法之中添加了log。结果出乎我的意料。添加了之前一直用的init方法、以及initWithNib方法、loadView方法。之后输出的结果为
提出两个问题:loadView和viewDidLoad输出了两遍?这个是为什么?并且init和initWithNib方法都没有输出?这又是为什么?
后来咨询大牛说会走initWithCoder方法和awakeFromNib方法,输出了下确实是这样的。但是为什么呢?initWithCoder和init、initWithNib方法有什么区别呢?
推测这一切都是因为sb导致的。就手动将sb文件去除了。方法是在Targets—>Deployment Info —->Main Interface中将这一栏的Main去掉。
再有就是将APP Icons and Launch Images 里的Launch Screen File 里的内容去掉。
有说在plist中需要把main 这行删除,但实验了一下删不删都一样。还有文件里的sb文件。不删除也是可以的。
感觉这样就完事了,不对的。运行之后看到了黑黑的一片。说是因为没有加载window。需要自己在APPDelegate中写入window加载方法。
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
self.window= [[UIWindowalloc]initWithFrame:[[UIScreenmainScreen]bounds]];//全屏window
self.window.backgroundColor= [UIColorwhiteColor];//白色背景
[self.windowmakeKeyAndVisible];
ViewController* vc=[[ViewControlleralloc]init];
self.window.rootViewController= vc;
//
// Override point for customization after application launch.
returnYES;
这个样子的话,初始化的过场动画,就有问题
结论:1:sb 使用initWithCoder xib使用initWithNibName 手写代码使用init。
2:导致loadview和viewdidload调用两遍的原因?
在调用loadView方法的时候要调用【super loadview】方法。super是执行了父类的方法,不写super值直接覆盖了,第一遍viewDidLoad的时候,发现没有东西,就再试一次。发现还没有就给你个黑框。
官方文档给出的解释/ This is where subclasses should create their custom view hierarchy if they aren't using a nib. Should never be called directly.如果不使用nib,子类应该创建自定义视图层次结构。不要直接被调用。意思就是说你要是在loadView调用super loadView的话,是执行了父类的loadView,要是不执行的话,就直接覆盖了,直接覆盖导致,没有view产生。以上就是想面两个问题的回答。所以loadView方法不能随便用。
注:仅供个人笔记使用。欢迎大牛指正。但对于人身攻击就免了。