iOSloadView 死循环,loadView 及使用loadView中初始化View注意的问题。(死循环并不可怕)
2017-06-27 14:55
330 查看
APP 运行,先跑init 然后跑
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 来查找XIB中有没有视图view。如果有,则不会再走loadView。如果这个时候你的VC是没有xib的,哪么显然走这个方法后,是找不到任何view的,即self.view 仍为nil.然后,就跑loadview,这个时候会被触发,如果在loadView中,什么也不做,也不实例化一个View。哪么程序继续跑到viewDidLoad里,如果这里还是没有实例化VIEW。哪么这个VC就没有视窗。在这里很多时侯会出现一个误区(死循环)。
好,下面来解释一下死循环的条件。
1、没有XIB。
2、ViewController中的loadView方法中没有做任何实例化self.view的操作。如:
-(void)loadView
{
写了一大堆代码,但最好并没有执行以下两种方式中的其中一种。
//方式一:实例化时使用[supper loadView];
//方式二 : self.view = [UIView alloc]....
}
3、在viewDidLoad中调用了self.view。
只要这三个条件同时满足,必定死循环。方式一时,调用了[Supper LoadView] 这个时候由父类产生了一个(0,20,Width,height )。这里的宽高根据是IPAD,还是IPHONE不同而不同,但原点坐标一定是(0,20)即去除状态条。方式二,没有对self.view作任可赋值,所以使得self.View = nil;
在条件二满足的情况下,程序运行到步骤三,这个时候,如果在这里调用了self.View。因为self.View在步骤二中为空,所以又回调到了loadView来,但因loadView中没有对self.View作实例化,于是在跑完loadView后,又继续跑viewDidLoad,但因ViewDidLoad中又没有实例化的情况下,使用了self.View.因此就出会现来回调用的现象。
好了,知疲知已方能百战百胜。解决死循环。
在步骤二中下手,处理方式有三:
a、把整个-(void)loadView 屏蔽掉。让父类自己来创建一个VIEW。这个是最常见的,因为ViewController产生的时候默认代码中是把这段代码给注释了的。
b、在loadView中添加一句[Supper LoadView];个人不太建议这样写吧,当然如果你理解了VIEW之间的关系,也无所谓。
c、在loadView中,使用已实例化的View对Self.View进行赋值。注:是使用=号赋值,而不是使用[self.view addSubView]因为此时self.view 是空指针,执行ADD操作会崩溃的。
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 来查找XIB中有没有视图view。如果有,则不会再走loadView。如果这个时候你的VC是没有xib的,哪么显然走这个方法后,是找不到任何view的,即self.view 仍为nil.然后,就跑loadview,这个时候会被触发,如果在loadView中,什么也不做,也不实例化一个View。哪么程序继续跑到viewDidLoad里,如果这里还是没有实例化VIEW。哪么这个VC就没有视窗。在这里很多时侯会出现一个误区(死循环)。
好,下面来解释一下死循环的条件。
1、没有XIB。
2、ViewController中的loadView方法中没有做任何实例化self.view的操作。如:
-(void)loadView
{
写了一大堆代码,但最好并没有执行以下两种方式中的其中一种。
//方式一:实例化时使用[supper loadView];
//方式二 : self.view = [UIView alloc]....
}
3、在viewDidLoad中调用了self.view。
只要这三个条件同时满足,必定死循环。方式一时,调用了[Supper LoadView] 这个时候由父类产生了一个(0,20,Width,height )。这里的宽高根据是IPAD,还是IPHONE不同而不同,但原点坐标一定是(0,20)即去除状态条。方式二,没有对self.view作任可赋值,所以使得self.View = nil;
在条件二满足的情况下,程序运行到步骤三,这个时候,如果在这里调用了self.View。因为self.View在步骤二中为空,所以又回调到了loadView来,但因loadView中没有对self.View作实例化,于是在跑完loadView后,又继续跑viewDidLoad,但因ViewDidLoad中又没有实例化的情况下,使用了self.View.因此就出会现来回调用的现象。
好了,知疲知已方能百战百胜。解决死循环。
在步骤二中下手,处理方式有三:
a、把整个-(void)loadView 屏蔽掉。让父类自己来创建一个VIEW。这个是最常见的,因为ViewController产生的时候默认代码中是把这段代码给注释了的。
b、在loadView中添加一句[Supper LoadView];个人不太建议这样写吧,当然如果你理解了VIEW之间的关系,也无所谓。
c、在loadView中,使用已实例化的View对Self.View进行赋值。注:是使用=号赋值,而不是使用[self.view addSubView]因为此时self.view 是空指针,执行ADD操作会崩溃的。
相关文章推荐
- IOS 的loadView 及使用loadView中初始化View注意的问题。(死循环并不可怕)
- IOS 的loadView 及使用loadView中初始化View注意的问题。(死循环并不可怕)
- IOS 的loadView 及使用loadView中初始化View注意的问题。(死循环并不可怕)
- IOS 的loadView 及使用loadView中初始化View注意的问题。(死循环并不可怕)
- IOS中ViewController中的loadView方法使用注意
- 使用ViewPager循环滑动时注意的问题
- iOS PSTCollectionView使用注意点
- 【iOS开发-104】SQLite使用:注意查询时分步写while会出现死循环
- iOS使用UIPageViewController结合多个UITableView后点击状态栏无法让UITableView置顶问题
- RealView MDK中使用内联函数时需要注意的问题
- ios 中使用 storyboard 来初始化view controller . 从xib文件中获取view
- IOS navigationItem.titleview上加控件时注意问题
- iOS UIAlertView使用注意事项
- 11、WebView 使用注意问题
- IOS中TableView使用注意
- (转)使用MVC框架中要注意的问题(六):何时使用PartialView方法
- 在ios中使用opencv将彩色图片转换成为灰度图,uiimageview无法显示问题
- 使用UIPickerView需要注意的问题时候
- IOS初学:使用PickView中遇到的问题
- IOS-翻转时,使用2个view的交换(需注意)