Objective-C 【init/initWithFrame调用机制】
2024-09-12 11:10:34
这是一个自定义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];
代码调用过程如下:
- 动态查找到 MyView 的 init 方法
- 调用 super init 方法
- super init 方法内部执行的是 [super initWithFrame:CGRectZero]
- 然后 super 会发现 MyView 实现了 initWithFrame 方法
- 转而执行 [MyView initWithFrame:CGRectZero]
- 最后再执行 init 其余部分
关键点:OC 里面的 super 实际上是让某个类自己去调用父类的方法, 而不是父类去调用某方法。方法动态调用过程中的顺序是按照继承关系从下到上。
或者:
init 内部会调用父类的 initWithFrame: 方法,只不过传入的 frame 的值为0,然后父类的 initWithFrame: 方法发现当前的调用对象是子类对象,所以就调用了子类的initWithFrame方法了。这是一个多态的应用。
最新文章
- 苹果下如果安装nginx,给nginx安装markdown第三方插件
- Urban Planning and Public Health - Reflection on Professor Webster's article in Urban Planning Forum
- IntelliJ_13书签
- TYVJ P1098 任务安排 Label:倒推dp 不懂
- Javascript模仿C语言的链表实现(增删改查),并且使用控制台输入输出
- typedef与define
- unity 组件开发
- python自学基础1week
- Mysql中的常用函数:
- 如何设置非管理员用户配置特定的IIS站点
- C#连接mysql数据库的一个例子和获取本机IP的方法
- 谈下mysql预处理基础
- 1.java的基础和数据类型
- comake2
- Python-HTML 最强标签分类
- p1465 Preface Numbering
- Python--多线程处理
- 转载:Google 官方应用架构的最佳实践指南 赞👍
- Java Web 学习与总结(二)Servlet核心接口+Servlet3.0配置
- Java泛型应用总结
热门文章
- linux 系统 cp: omitting directory 问题解决
- sqli-labs(七)——登陆处sql注入
- InstallShield2015制作安装包----------卸载后删除安装目录和文件
- python windows 安装gensim
- SQL Server如何将Id相同的字段合并,并且以逗号隔开
- Hibarnate控制台打印不出sql,并且报出异常:org.hibernate.exception.JDBCConnectionException: Cannot open connection
- hdu5032 树状数组
- [转]sql server 常用脚本(日常查询所需)
- ubuntu14.04 cpu-ssd
- HADOOP nutch java mysql