UIViewController

作者: 凌晨四点的洛杉矶 | 来源:发表于2015-12-26 09:27 被阅读213次

    UIViewController是iOS顶层视图的载体及控制器,用户与程序界面的交互都是由UIViewController来控制的,UIViewController管理UIView的生命周期及资源的加载与释放。

    UIView

    经常有同学问到获取宽度或者坐标时到底用frame 还是 bounds, 在这里说一下最主要的区别, 看情况使用.

    UIView 的 framebounds 属性的区别
    frame : 相对于父视图的大小和位置, xy 是当前 view 的坐标.
    bounds : 相对于自身位置的大小和位置, xy 永远为0, 即屏幕原点 .

    UIScreen

    • 获取带有状态栏的 Rect
    CGRect bounds = [UIScreen mainScreen].bounds;
    
    • 获取不带状态栏的 Rect
    CGRect bounds = [[UIScreen mainScreen] applicationFrame];
    
    • 获取状态栏的位置和大小
    CGRect rect = [[UIApplication sharedApplication] statusBarFrame];
    

    执行顺序

    1. alloc -- 创建对象, 分配空间
    2. init -- 初始化对象, 初始化数据
    3. loadView -- 从 nib 载入视图
    4. viewDidLoad -- 载入完成,可以进行自定义数据以及动态创建其他控件
      注: 此方法只在 app 刚开始加载时调用一次,以后不会调用.
    5. viewWillAppear -- 视图将要出现在屏幕上
      注: 此方法可以设置不同方向时设备如何显示
    6. viewDidAppear -- 视图已在屏幕上渲染完成
    7. viewWillDisappear -- 视图将在屏幕上移除
    8. viewDidDisappear -- 视图已经移除
    9. 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方法。

    相关文章

      网友评论

        本文标题:UIViewController

        本文链接:https://www.haomeiwen.com/subject/ttovhttx.html