`
dcj3sjt126com
  • 浏览: 1876832 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

UIViewController生命周期控制

    博客分类:
  • IOS
 
阅读更多

UIViewController生命周期控制

UIViewController介绍

官方的介绍如下

The UIViewController class provides the fundamental view-management model for all iOS apps. You rarely instantiate UIViewController objects directly. Instead, you instantiate subclasses of the UIViewController class based on the specific task each subclass performs.

简单的说就是一个视图控制器类

ios6以后的一般的生命周期

ios6以后取消了viewWillUnload方法,apple官方文档说没必要了(我勒个去了),大体就是view和显示分开了,当内存紧张的时候系统会帮你回收显示的贴图.这个贴图呢只是先标记为已经清除,如果你没用到这块内存,下次需要显示这个view的时候,还可以立马复用来.新的周期图大致如下.

在生命周期中, 给要做的事情分类

一千个人眼里有一千个哈姆雷特, 如果不统一下, 每个程序员按照自己的习惯的代码风格去写, 会给维护造成了困扰,所以我们给UIViewController的申明周期中加上一些方法来规范下

  • loadView 中加上三个方法

    • createFields 接受参数,初始化变量
    • createViews 创建视图
    • createEvents 绑定事件,如按钮的点击,NotificationCenter,kvo等
  • viewDidLoad

    • loadData 加载数据,调用一些api
  • dealloc

    • destroyEvents 取消事件的绑定
    • destroyViews 释放,销毁视图
    • destroyFields 释放,销毁引用的变量
  • didReceiveMemoryWarning

    • cleanData 释放一些可以释放的数据
  • 额外

    • enterForeground 进入前台时调用
    • enterBackground 进入后台时调用

规范文件内部组织结构

定义了运行时要做的事后,我们再来统一下文件内如何写

首先是头文件

@interface UIViewController (base)
#pragma mark- model
// 定义model

#pragma mark- view
// 定义view

#pragma mark- api
// 定义api
@end

实现文件

#pragma mark - api
// 对外的接口

#pragma mark - rewrite
// 额外的重写的父类的方法

#pragma mark - private

#pragma mark - 响应 model 的地方
#pragma mark 1 notification
#pragma mark 2 KVO

#pragma mark - 响应 view 的地方
#pragma mark 1 target-action
#pragma mark 2 delegate dataSource protocol

#pragma mark -

结束

至此呢,我们的UIViewController就有了一个统一的风格,在团队的扩建中,再统一下命名,代码看起来就舒服多了

实现代码

实现可以用runtime,也可以用基类, 个人推荐是用基类,但是下面的代码是runtime的

@implementation UIViewController (base)

+ (void)load
{
    XY_swizzleInstanceMethod([UIViewController class], @selector(loadView), @selector(xy__loadView));
    XY_swizzleInstanceMethod([UIViewController class], @selector(viewDidLoad), @selector(xy__viewDidLoad));
    XY_swizzleInstanceMethod([UIViewController class], NSSelectorFromString(@"dealloc"), @selector(xy__dealloc));
    XY_swizzleInstanceMethod([UIViewController class], @selector(didReceiveMemoryWarning), @selector(xy__didReceiveMemoryWarning));
}

- (void)xy__loadView
{
    [self xy__loadView];

    if ([self respondsToSelector:@selector(createFields)])
        [self performSelector:@selector(createFields)];

    if ([self respondsToSelector:@selector(createViews)])
        [self performSelector:@selector(createViews)];

    if ([self respondsToSelector:@selector(enterBackground)])
    {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(enterBackground) name:UIApplicationDidEnterBackgroundNotification object:nil];
    }

    if ([self respondsToSelector:@selector(enterForeground)])
    {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(enterForeground) name:UIApplicationWillEnterForegroundNotification object:nil];
    }

    if ([self respondsToSelector:@selector(createEvents)])
        [self performSelector:@selector(createEvents)];
}

- (void)xy__dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];

    if ([self respondsToSelector:@selector(destroyEvents)])
        [self performSelector:@selector(destroyEvents)];

    if ([self respondsToSelector:@selector(destroyViews)])
        [self performSelector:@selector(destroyViews)];

    if ([self respondsToSelector:@selector(destroyFields)])
        [self performSelector:@selector(destroyFields)];

    [self xy__dealloc];
}

- (void)xy__viewDidLoad
{
    if ([self respondsToSelector:@selector(loadData)])
        [self performSelector:@selector(loadData)];

    [self xy__viewDidLoad];
}

- (void)xy__didReceiveMemoryWarning
{
    if ([self isViewLoaded] && [self.view window] == nil)
    {
        if ([self respondsToSelector:@selector(cleanData)])
            [self performSelector:@selector(cleanData)];
    }

    [self xy__didReceiveMemoryWarning];
}

@end
分享到:
评论

相关推荐

    UIViewController生命周期详解

    通过对`UIViewController`生命周期的深入了解,我们可以更好地管理视图控制器的各个状态,并确保应用能够高效地运行。此外,了解每个生命周期方法的调用顺序,对于优化性能和避免内存泄漏至关重要。 - 在初始化阶段...

    iOS开发教程之UIView和UIViewController的生命周期详解

    接着,我们转向UIViewController的生命周期。UIViewController在加载视图时有其特定的流程。当创建一个UIViewController实例时,我们可以使用`init`,`initWithNibName:bundle:`,或`initWithCoder:`。在代码中,...

    UIViewController Demo源代码

    通过学习这个`UIViewController Demo`源代码,开发者可以更好地理解`UIViewController`的生命周期、视图加载机制以及如何在不同情况下创建和使用视图控制器。同时,掌握这两种创建方式有助于提高代码的灵活性和可...

    IOS 生命周期

    在iOS中,UIViewController是视图控制器的核心类,它负责管理一个或多个视图的生命周期。当你创建一个新的空项目并运行时,你可以观察到如`viewDidLoad`、`viewWillAppear:`、`viewDidAppear:`、`viewWillDisappear:...

    iOS App开发中UIViewController类的使用教程

    本文将深入探讨UIViewController的生命周期及其主要属性和方法,帮助开发者更好地理解和运用这一关键组件。 首先,我们要理解UIViewController的生命周期,这是了解其工作原理的基础。生命周期包含了从创建、加载...

    LifecycleHooks:将自定义代码注入视图和视图控制器以响应生命周期事件

    UIViewController生命周期挂钩: viewDidLoad viewWillAppear viewDidAppear viewWillDisappear viewDidDisappear UIView生命周期挂钩: didMoveToWindow 注意:操作是在对象自己执行相应方法之后执行的,但...

    UIViewController+Swizzling 实现页面统计

    本篇文章将深入探讨如何通过`UIViewController+Swizzling`来实现在不修改原有代码的情况下,对页面视图控制器的生命周期进行统计。 首先,我们需要理解什么是Method Swizzling。在Objective-C中,由于其动态性,...

    UIViewController

    2. **生命周期方法**: - `loadView`:当`view`属性为`nil`时,系统会调用此方法加载视图。一般情况下,我们不需要重写这个方法,除非有特殊需求。 - `viewDidLoad`:视图加载完成后调用,可以在这个方法中设置...

    UIViewController新使用方法源码

    4. **生命周期方法的增强** iOS 5新增了`willAnimateRotationToInterfaceOrientation:duration:`和`didRotateFromInterfaceOrientation:`方法,帮助开发者在界面旋转过程中处理动画。不过,这些方法在iOS 6后被`...

    IOS视图控制器的生命周期实例详解

    在iOS开发中,视图控制器(UIViewController)是构建用户界面的核心组件。它的生命周期是指从创建到销毁的过程中,系统调用的一系列方法。...记住,理解视图控制器的生命周期是优化iOS应用的关键一步。

    iOS5 UIViewController 新特性

    通过addChildViewController方法添加子控制器,并调用didMove(toParent:)方法完成添加过程,可以确保生命周期管理和事件传递的正确性。 5. **Notification Center**:UIViewController在iOS5中对Notification ...

    深入讲解iOS开发中的UIViewController

    而UIViewController则是负责管理这些UIView的控制器,它不直接参与视图的绘制,而是控制UIView的生命周期、布局和行为。可以将UIViewController看作是一个框架,它可以根据需要添加、移除或替换UIView,就像更换相框...

    RRViewControllerExtension:UINavigationBar外观管理,内存泄漏检测,便捷的UIViewController属性和方法

    UIViewController生命周期方法挂钩 其他便利的属性 在github上引用,。 预习 用法 UINavigationBar外观管理 只需通过覆盖UIViewController+RRExtension.h中定义的viewcontroller方法,就可以静态或动

    swift-UISegmentedControl使用ChildViewController切换UIViewcontroller

    这种方式允许我们在一个父控制器中管理多个子控制器的生命周期,而无需手动处理每个子控制器的加载、显示和释放,大大简化了代码结构。 接下来,我们将`UISegmentedControl`与`ChildViewController`结合使用: 1. ...

    UIViewController的加载方式和UIView的加载详解

    UIViewController负责管理视图的生命周期,而UIView则负责显示内容和响应用户的交互。了解UIViewController的加载方式以及UIView的加载机制对于开发一个功能强大且高效的应用程序至关重要。 ### UIViewController的...

    swift-一个UIViewController自定义缩放过渡动画

    首先,我们需要了解UIViewController的生命周期和过渡动画的基础知识。UIViewController提供了`present`和`dismiss`方法来显示和隐藏其他视图控制器,而这些操作默认伴随着系统提供的过渡动画。但为了实现个性化的...

    第五节 编程定制UIViewController.docx

    `viewDidLoad`只是生命周期中的一个阶段,你还可以在其他方法中,如`viewWillAppear:`、`viewDidAppear:`、`viewWillDisappear:`和`viewDidDisappear:`等,根据需求进行额外的视图配置和逻辑处理。 总之,通过编程...

    视图控制器无动画版代码完整版.7z

    - 理解并掌握UIViewController生命周期对于iOS开发至关重要。 - 实践代码阅读,分析视图控制器如何处理视图和数据,以及如何响应用户交互。 - 尝试添加动画效果,了解动画如何增强用户体验。 总之,这个压缩包...

Global site tag (gtag.js) - Google Analytics