2019独角兽企业重金招聘Python工程师标准>>>

每个ios开发者对loadView和viewDidLoad肯定都很熟悉,虽然这两个函数使用上真的是非常简单,但是和类似的initWithNibName/awakeFromNib/initWithCoder放在一起还是非常容易让人混淆的.

昨天看了下苹果官方的相关文档以及几篇相关内容的网页(一 二 三),其实这个内容以前也看过,似乎也搞清楚了,可还是忘了.好急性不如烂笔头,这次一定要好好记下来.
大前提是UIViewController有一个UIView.同时,需要厘清两个概念,创建一个类和实例化一个类.在XCode中创建一个类和实例化一个类很容易区分,但是在IB(Interface Builder)中有时候就会迷糊.其实也很好区分,孤零零地创建了一个nib文件,没有和其他可被实例化的类有直接或间接关系的时候,这个类或这些类(一个nib文件俺也可能包含多个类)是没有机会被实例化的,所以这种情况只是通过ib创建了一个类,而没有实例化.真正的实例化还需要通过在Xcode用代码来读取这个nib文件.知道这两这的区别后这些方法也就容易辨认多了
viewDidLoad其实没什么可混淆的,无论通过什么途径加载(Xcode或者IB,这里的加载属于实例化)完view后肯定会执行这个方法.
loadView需要分两种情况.当你通过Xcode实例化一个类的时候就需要自己在controller中实现这个方法.而在IB中实例化就不需要实现它.
initWithNibName这个方法是在controller的类在IB中创建,但是通过Xcode实例化controller的时候用的.
awakeFromNib这个方法是一个类在IB中被实例化是被调用的.看了帖子发现大家都推荐使用viewDidLoad而不要使用awakeFromNib,应为viewDidLoad会被多次调用,而awakeFromNib只会当从nib文件中unarchive的时候才会被调用一次.实际测试中发现,当一个类的awakeFromNib被调用的时候,那么这个类的viewDidLoad就不会被调用了,这个感觉很奇怪.
initWithCoder是一个类在IB中创建但在xocdde中被实例化时被调用的.比如,通过IB创建一个controller的nib文件,然后在xocde中通过initWithNibName来实例化这个controller,那么这个controller的initWithCoder会被调用.

如果你的对象是UIViewControler的子类,那么你必须调用- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil;方法去调用NIB文件初始化自身,即使那没有使用nib文件也会调用这个函数(默认情况下init方法已经为你的做这件事情了),如果你调用这个方法,并传递的两个参数为空(nil),然后类会调用-loadView去读取一个名字和你的UIViewController名字相同的nib文件,来初始化自身。如果没有这样的nib文件,你必须调用-setView:来设置一个self.view。或者重载-loadView 方法。

转载于:https://my.oschina.net/fadoudou/blog/479680

initWithNibName/awakeFromNib/initWithCoder相关推荐

  1. iphone开发基础:loadView/viewDidLoad/initWithNibName/awakeFromNib/initWithCoder的用法

    每个ios开发者对loadView和viewDidLoad肯定都很熟悉,虽然这两个函数使用上真的是非常简单,但是和类似的initWithNibName/awakeFromNib/initWithCod ...

  2. loadView与viewDidLoad不同

    loadView 和 viewDidLoad 是 iPhone 开发中肯定要用到的两个方法. 他们都可以用来在视图载入的时候初始化一些内容. 但是他们有什么区别呢? viewDidLoad 方法只有当 ...

  3. c语言中执行一次的函数once,iOS只执行一次的方法

    IOS开发(64)之GCD任务最多只执行一次 1 前言 使用 dispatch_once 函数 在 APP 的生命周期内来保证你想确保每段代码只执行一次,即使它在代码的不同地方多次调用(比如单例的初始 ...

  4. iOS控制器与视图加载方法

    转载记录, 请看原文: 1. iOS中的各种加载方法(initWithNibName,loadNibNamed,initWithCoder,awakeFromNib等等)简单使用   http://w ...

  5. iOS一个类可以关联多个nib文件

    iOS多个nib文件关联同一个类 一.什么情况下使用多个nib文件关联同一个类? 最常用的情况就是,可以实现同一个类的多个界面的初始化,因为可以使用initWithNibName方法来调用不同的xib ...

  6. iOS开发笔记(IOS7回归)

    <---点击左上角目录,可以快速查找这里是否有你遇到的问题条目<--- 1,iOS中如何设置项目/文件是否支持ARC 旧工程配置arc方案: 1,直接在targets->build ...

  7. loadView、viewDidLoad、initWithCoder、initWithNibName、awakeFromNib的用法

    转载,原地址为:http://jianyu996.blog.163.com/blog/static/11211455520131226840879/ 请尊重原创: 1,无论XIB还是代码创建都会调用l ...

  8. awakeFromNib与initWithCoder

    (1)awakeFromNib和initWithCoder:差别 awakeFromNib 从xib或者storyboard加载完毕就会调用 initWithCoder: 只要对象是从文件解析来的,就 ...

  9. initWithFrame,initWithCoder,awakeFromNib的区别

    这三个都是系统初始化视图时会调用的方法. initWithFrame主要用在非xib创建的视图 initWithCoder和awakeFromNib主要用在xib创建的视图    两个调用的先后顺序是 ...

最新文章

  1. 简单实例使用_一个关于jmeter的使用简单实例
  2. mysql 新增从数据库_从零开始学 MySQL - 创建数据库并插入数据
  3. 开源开放 | 细粒度可循证医学文档知识融合表示和推理(CCKS2021)
  4. SerializeUtil 序列化 java
  5. python 核心编程 第一部分
  6. Altium AD20原理图从库中更新变动,库中模型修改后同步到原理图中
  7. 离线搭建安卓环境 adt
  8. 建模步骤_数学建模的基本步骤
  9. iso标准软件测试标准,软件质量-ISO9000标准+SQA简介
  10. python绘图苹果_如何使用python代码画一个苹果?
  11. 2021中国移动秋招备考知识
  12. 雅虎邮箱pop服务器,雅虎邮箱pop如何设置
  13. 手机连接wifi时使用固定mac地址
  14. k43.第十七章 K8s运维篇-DevOps 持续集成 持续部署 (三)
  15. 膨胀卷积(空洞卷积)学习篇
  16. 天然“降脂药”,帮你“吃掉”血脂!
  17. Java 正则表达式 手机号 身份证号脱敏
  18. 北漂经历 | 我在北京这几年(全)
  19. 2012年一个屌丝程序员的学习总结:读书、户外、泡妞、习惯、母猪产后护理...
  20. cmake错误:CMake Error: CMake can not determine linker language for target

热门文章

  1. 计算机专业i7 7500u,8550U比7500U提升多少 8550U和7500U的区别-太平洋电脑网
  2. centos7 python3.6升级到3.7_Centos7下把python 2.7升级到python 3.6(升级过程遇到的一些相关问题)...
  3. iis7+php_5.5,IIS7+php5.5+fastcgi
  4. 计算机编程英文术语,计算机编程英语词汇
  5. mysql清理连接数缓存,MySQL连接池、线程缓存、线程池的区别
  6. bash shell 变量的配置守则
  7. Lua5.3手册标准库拾遗
  8. 阿里巴巴Java开发规约IDEA插件安装及使用
  9. 3.4_函数_Function_Part_2
  10. android edittext 限制文本框输入的长度和提示信息