这是一个自定义view:

@implementation MyView

- (instancetype)init {
if (self = [super init]) {
NSLog(@"调用了init");
}
return self;
} - (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
NSLog(@"调用了initWithFrame");
}
return self;
} @end

现在我调用它的init方法:

MyView *myView = [[MyView alloc] init];

控制台打印信息是:
2017-10-09 11:14:35.224 block[2391:262544] 调用了initWithFrame
2017-10-09 11:14:35.225 block[2391:262544] 调用了init

问:
为什么先打印的是initWithFrame而不是init?

答:

MyView *myView = [[MyView alloc] init];

代码调用过程如下:

  1. 动态查找到 MyView 的 init 方法
  2. 调用 super init 方法
  3. super init 方法内部执行的是 [super initWithFrame:CGRectZero]
  4. 然后 super 会发现 MyView 实现了 initWithFrame 方法
  5. 转而执行 [MyView initWithFrame:CGRectZero]
  6. 最后再执行 init 其余部分

关键点:OC 里面的 super 实际上是让某个类自己去调用父类的方法, 而不是父类去调用某方法。方法动态调用过程中的顺序是按照继承关系从下到上。

或者:

init 内部会调用父类的 initWithFrame: 方法,只不过传入的 frame 的值为0,然后父类的 initWithFrame: 方法发现当前的调用对象是子类对象,所以就调用了子类的initWithFrame方法了。这是一个多态的应用。

最新文章

  1. 苹果下如果安装nginx,给nginx安装markdown第三方插件
  2. Urban Planning and Public Health - Reflection on Professor Webster's article in Urban Planning Forum
  3. IntelliJ_13书签
  4. TYVJ P1098 任务安排 Label:倒推dp 不懂
  5. Javascript模仿C语言的链表实现(增删改查),并且使用控制台输入输出
  6. typedef与define
  7. unity 组件开发
  8. python自学基础1week
  9. Mysql中的常用函数:
  10. 如何设置非管理员用户配置特定的IIS站点
  11. C#连接mysql数据库的一个例子和获取本机IP的方法
  12. 谈下mysql预处理基础
  13. 1.java的基础和数据类型
  14. comake2
  15. Python-HTML 最强标签分类
  16. p1465 Preface Numbering
  17. Python--多线程处理
  18. 转载:Google 官方应用架构的最佳实践指南 赞👍
  19. Java Web 学习与总结(二)Servlet核心接口+Servlet3.0配置
  20. Java泛型应用总结

热门文章

  1. linux 系统 cp: omitting directory 问题解决
  2. sqli-labs(七)——登陆处sql注入
  3. InstallShield2015制作安装包----------卸载后删除安装目录和文件
  4. python windows 安装gensim
  5. SQL Server如何将Id相同的字段合并,并且以逗号隔开
  6. Hibarnate控制台打印不出sql,并且报出异常:org.hibernate.exception.JDBCConnectionException: Cannot open connection
  7. hdu5032 树状数组
  8. [转]sql server 常用脚本(日常查询所需)
  9. ubuntu14.04 cpu-ssd
  10. HADOOP nutch java mysql