转自:http://blog.csdn.net/kevinpake/article/details/12790407
一、loadView
1.什么时候被调用?
每次访问UIViewController的view(比如controller.view、self.view)而且view为nil,loadView方法就会被调用。
2.有什么作用?
loadView方法是用来负责创建UIViewController的view
3.默认实现是怎样的?
默认实现即[super loadView]里面做了什么事情。
1> 它会先去查找与UIViewController相关联的xib文件,通过加载xib文件来创建UIViewController的view
- 如果在初始化UIViewController指定了xib文件名,就会根据传入的xib文件名加载对应的xib文件
[[MJViewController alloc] initWithNibName:@"MJViewController" bundle:nil];
2> 如果没有找到相关联的xib文件,就会创建一个空白的UIView,然后赋值给UIViewController的view属性,大致如下
self.view = [[[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];
// applicationFrame的值是:{{x = 0, y = 20}, {width = 320, height = 460}}
[super loadView]里面就大致完成1>和2>中叙述的内容
4.怎样正确使用这个方法?
大家都知道UIViewController的view可以通过xib文件来创建,但是在某些情况下,xib不是那么地灵活,所以有时候我们想通过代码来创建UIView,比如:
self.view = [[[UIWebView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];
如果想通过代码来创建UIViewController的view,就要重写loadView方法,并且不需要调用[super loadView],因为在第3点里面已经提到:若没有xib文件,[super loadView]默认会创建一个空白的UIView。我们既然要通过代码来自定义UIView,那么就没必要事先创建一个空白的UIView,以节省不必要的开销。正确的做法应该是这样:
1 - (void)loadView { 2 self.view = [[[UIWebView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease]; 3 }
不需要调用[super loadView],你调用了也不会出错,只是造成了一些不必要的开销。
总结一句话,苹果设计这个方法就是给我们自定义UIViewController的view用的
二、viewDidLoad
1.什么时候被调用?
无论你是通过xib文件还是重写loadView方法创建UIViewController的view,在view创建完毕后,最终都会调用viewDidLoad方法
2.有什么作用?
一般我们会在这里做界面上的初始化操作,比如往view中添加一些子视图、从数据库或者网络加载模型数据装配到子视图中。例如:
1 - (void)viewDidLoad 2 { 3 [super viewDidLoad]; 4 5 // 添加一个按钮 6 UIButton *button = [UIButton buttonWithType:UIButtonTypeContactAdd]; 7 [button addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside]; 8 [self.view addSubview:button]; 9 }
三、viewDidUnload
1.什么时候被调用?
iOS设备的内存是极其有限的,如果应用程序占用的内存过多的话,系统就会对应用程序发出内存警告。UIViewController就会收到didReceiveMemoryWarning消息。didReceiveMemoryWarning方法的默认实现是:如果当前UIViewController的view不在应用程序的视图层次结构(View Hierarchy)中,即view的superview为nil的时候,就会将view释放,并且调用viewDidUnload方法
2.有什么作用?
上面说到,发出内存警告且view被释放的时候就会调用viewDidUnload方法,所以一般在释放资源,主要是释放界面元素相关的资源,将相关的实例都赋值为nil
1 - (void)viewDidUnload { 2 [super viewDidUnload]; 3 self.name = nil; 4 self.pwd = nil; 5 }
3.dealloc也是用来释放资源的,那跟viewDidUnload有什么关系?
当发出内存警告调用viewDidUnload方法时,只是释放了view,并没有释放UIViewController,所以并不会调用dealloc方法。即viewDidUnload和dealloc方法并没有任何关系,dealloc方法只会在UIViewController被释放的时候调用
四、三个方法的关系
1.第一次访问UIViewController的view时,view为nil,然后就会调用loadView方法创建view
2.view创建完毕后会调用viewDidLoad方法进行界面元素的初始化
3.当内存警告时,系统可能会释放UIViewController的view,将view赋值为nil,并且调用viewDidUnload方法
4.当再次访问UIViewController的view时,view已经在3中被赋值为nil,所以又会调用loadView方法重新创建view
5.view被重新创建完毕后,还是会调用viewDidLoad方法进行界面元素的初始化
相关推荐
主要介绍了IOS 中loadView,viewDidLoad,viewDidUnload详解及使用的相关资料,需要的朋友可以参考下
loadView和viewDidLoad、viewDidUnLoad区别
学长发我的,我无耻的分享给大家了。 希望大家对于那些 viewdidload viewwillappear 的调用顺序有个了解。
主要介绍了详解iOS App开发中UIViewController的loadView方法使用,讲解了访问view属性时loadView方法的调用及使用loadView时的一些注意点,需要的朋友可以参考下
每个ios开发者对loadView和viewDidLoad肯定都很熟悉,虽然这两个函数使用上真的是非常简单,但是和类似的initWithNibName/awakeFromNib/initWithCoder放在一起还是非常容易让人混淆的. 昨天看了下苹果官方的相关文档...
TKLoadView 自定义LoadView API与APPLE的UIActivityIndicatorView相同,并且我已经提供了协议。
revit二次开发在wpf中显示模型,利用Autodesk 提供的PreviewControl 方法,在wpf界面中显示项目中的某个视图
我们加载Listview等,往往需要耗时几秒,这和等待过程加上一些交互效果自然会让人感觉输入一些,常见的转圈圈自不必说,但是按照通常的想法,我们往往是加xml里面的view通过隐藏和现实来实现,这种方式实在不太方便...
在ViewDidLoad或LoadView方法中,设置videoPath 。 它可以是本地路径,也可以是 url。 然后,调用play 。 享受 :)例子- ( void )viewDidLoad { [ super viewDidLoad ]; self. videoPath = [[ NSBundle mainBundle...
LoadMoreHelper 原SwipeLoadView已经改名为LoadMoreHelper,支持更多刷新控件。 LoadMoreHelper可以为任意下拉刷新控件,多种滚动布局(RecyclerView, ListView, GridView, ExpandableListView等) ...
let loadView = LWTGifLoadView(frame:self.view.frame, callback:{ //网络请求 print("重新请求") }) self.view.addSubview(loadView) ``` github下载:https://github.com/winterLiao/GifLoadView
1.基于swift4.2框架组件化 2.rxswift做网络回调处理、mock数据管理 ...5.带EmptyView LoadView ErrorView的BaseViewController 6.带EmptyView LoadView ErrorView的TableView和CollectionView ...
*在视图中修改的话就在loadView中 *在AppDelegate中: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 1.关闭键盘: [[IQKeyboardManager ...
_loadview = [[MBLoadingIndicator alloc ] init ]; // Start the loader [ self .loadview start ]; // Add the loader to our view [ self .view addSubview: self .loadview]; 用法 ###更改百分比 // ...
// 设置LoadView的factory,用于创建使用者自定义的加载失败,加载中,加载更多等布局,写法参照DeFaultLoadViewFactory // ListViewHelper.setLoadViewFractory(new LoadViewFractory()); PullToRefreshListView ...
pulltorefreshAndroid下拉刷新库,利用viewdraghelper实现集成了下拉刷新,底部加载更多,以及刚进入加载数据的loadview。包括了listview与gridview的改写。效果1:效果2:效果3:效果4:效果5:使用说明:imageList=...
Android-shapeLoadingView是一款高仿新版58加载动画。... android:id="@ id/loadView" android:layout_width="fill_parent" android:layout_height="fill_parent"/> 动画自动加载 标签:Android
4.SurfaceView 并不适合作为loadview,这句话并不肯定,因为我没有尝试过其他情况,在我的APP中我用了SurfaceView这个作为loagdview,中间会有些UI不同协同的情况。我并没有舍弃这个控件。正如前面所提的这是个学习...