UIViewController是iOS顶层视图的载体及控制器,用户与程序界面的交互都是由UIViewController来控制的,UIViewController管理UIView的生命周期及资源的加载与释放。
UIView
经常有同学问到获取宽度或者坐标时到底用frame
还是 bounds
, 在这里说一下最主要的区别, 看情况使用.
UIView 的
frame
和bounds
属性的区别
frame
: 相对于父视图的大小和位置,x
和y
是当前 view 的坐标.
bounds
: 相对于自身位置的大小和位置,x
和y
永远为0, 即屏幕原点 .
UIScreen
- 获取带有状态栏的 Rect
CGRect bounds = [UIScreen mainScreen].bounds;
- 获取不带状态栏的 Rect
CGRect bounds = [[UIScreen mainScreen] applicationFrame];
- 获取状态栏的位置和大小
CGRect rect = [[UIApplication sharedApplication] statusBarFrame];
执行顺序
- alloc -- 创建对象, 分配空间
- init -- 初始化对象, 初始化数据
- loadView -- 从 nib 载入视图
- viewDidLoad -- 载入完成,可以进行自定义数据以及动态创建其他控件
注: 此方法只在 app 刚开始加载时调用一次,以后不会调用. - viewWillAppear -- 视图将要出现在屏幕上
注: 此方法可以设置不同方向时设备如何显示 - viewDidAppear -- 视图已在屏幕上渲染完成
- viewWillDisappear -- 视图将在屏幕上移除
- viewDidDisappear -- 视图已经移除
- dealloc -- 视图被销毁
内存警告
当程序收到内存警告的时候,会调用每一个ViewController的
didReceiveMemoryWarning
方法,我们需要做出相应,释放程序中暂时不需要的资源, 通常 vc 中系统已经给我们重写好了此方法, 但记得调用 super 方法.
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
float ver = [[[UIDevice currentDevice] systemVersion] floatValue];
if(ver >= 6.0f)
{
if(self.isViewLoaded && !self.view.window)
{
self.view = nil; //确保下次重新加载
}
}
}
上面的代码先取得当前iOS系统的版本号
-
如果是iOS6.0或以上版本,进一步判断
视图是否被装载进内存
,并且是否为当前视图
,在这两个条件都满足(已经装载进内存&&不是当前视图)时,将self.view设置为nil,这样就能保证再调用该ViewController时,loadView和viewDidLoad被再次调用。 -
iOS3.0 - iOS6.0期间,didReceiveMemoryWarning方法会判断当前ViewController的view是否显示在window上,如果没有显示在window上,则didReceiveMemoryWarning会自动将ViewController的view以及其所有子view全部销毁,然后调用View Controller的viewDidUnload方法。
网友评论