iOS self 和 super 学习
有人问我 这个问题 回答错了,题干大概是说 [self class] 和 [super class]打印结果 是不是一样的.
我睁着眼睛说是不一样的 .因为我明明记得 几天前 做 DFS 获取反射基类 用到了这块
然 pia pia 打脸
运行一遍 先印证答案:
在 AppDelegate 里面:
NSLog(@" %@ %@ %@",[self class],[super class],[self superclass]);
打印结果:
2016-05-18 16:38:14.918 dailylife[34114:1143377] AppDelegate AppDelegate UIResponder
其实看出来大概的区别了
和臆想一样的 是"[self superclass]" 大概以为 最终结果 相同的人 都以为 [super class] 是 [self superclass].
其实,在开发过程 我真的没有 说因为这个问题出错.
因为在写 init 方法中 首先会考虑到 override (重用) 的问题 会先 写 [super class] . 然后 你要实施的重用 写在该行代码的下边.
如果当时 我考虑到这个实际运用情况 就不会答错了,真心丢人.
这就是纯理论 和 实战 对于一问题 不同的诠释吧.
那么现在讨论一下 为什么 [self class] 和 [super class]打印的结果相同
self : 我的理解 就是 当前类的 对象的本身 , 那么 [self class] 就可理解 为 获取当前对象的类. 英文解释:"self refers to the object receiving a message in objective-C programming."
super : 网上 解释 它是一个编译器的指令符号,我个人现在的理解 它是一种系统级别的 回溯查找 一直找到根,返回的接受者是 [self class] ;英文解释:"super is a flag that tells the compiler to search for the method implementation in a very different place. It begins in the superclass of the class that defines the method where super appears."
网上特意讲了底层机制: 我就不贴代码了
http://chun.tips/blog/2014/11/05/bao-gen-wen-di-objective[nil]c-runtime%281%29[nil]-self-and-super/
但是 我不认为 网上说的 或者询问方式为类似 "Why does “[self class] == [super class]”?" "或者说 它们两个相等" 之类的 .我只能说他们结果一致 在一定程度上可以替换 .
但是滥用 也是有后果的, 会出现一个闭环.
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if(self){
//TODO: }
return self;
}
- (instancetype)initWithFrame:(CGRect)frame
{
self = [self initWithFrame:frame];
if(self){
//TODO: }
return self;
}
- (instancetype)initWithNew:(CGRect)frame
{
self = [self initWithFrame:frame];//super as well
if(self){
//TODO: }
return self;
}
我这么写,应该很容易看出来了吧,
第一种情况,通过 super 编译指令开始回溯,如果还有重写回溯重写 然后继续回溯 一直到基类.
第二段代码 则是再次调用当前方法 然后陷入了死循环.(类似这种情况就不能滥用, 并且 我们知道 在 初始化方法里面 尽量不要用点语法 ,不一定什么时候 就造成循环引用, 当然我们知道有这个坑,自己有避免的机制也无所谓啦)
第三段代码 我们看到 这个时候 方法名不一样 initWithNew: 和 initWithFrame: ,所以 用super self 都行 ,self 也最终会走到 super 的方法. 大家也可以在工程里面写这几个方法 然后点击进去,或者debug一下看看走的每一步.
学到什么程度 都会有不懂的问题,也许对别人很简单,自己才会. 丢脸不要紧 只要敢去找回你的颜.
慢慢积累吧 日子长着呢
iOS self 和 super 学习的更多相关文章
- IOS开发-OC学习-常用功能代码片段整理
IOS开发-OC学习-常用功能代码片段整理 IOS开发中会频繁用到一些代码段,用来实现一些固定的功能.比如在文本框中输入完后要让键盘收回,这个需要用一个简单的让文本框失去第一响应者的身份来完成.或者是 ...
- IOS开发-UI学习-sqlite数据库的操作
IOS开发-UI学习-sqlite数据库的操作 sqlite是一个轻量级的数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了,而且它的处理速度比Mysql.PostgreSQL这 ...
- IOS 关键字self,super,copy, retain, assign , readonly , readwrite, nonatomic、 @synthesize、@property、@dynamic
IOS 关键字self,super,copy, retain, assign , readonly , readwrite, nonatomic. @synth ...
- ios和android一并学习的体会
如果说为什么要同时学习这两种不同的移动平台,其实有一定的“闲”的因素在里面. 相对于ios,android我是早半年接触的.最开始学习的时候也就是j2ee学习的延续,通过看视频连带看书学了大概一个月的 ...
- [iOS]关于零基础学习iOS开发的学习方法总结
关于零基础学习iOS开发的学习方法总结 最近很多零基础来参加蓝鸥培训的学生经常会问到一些学习方法的问题,就如下我自己见过的好的学习方法一起讨论一下. 蓝鸥iOS开发技术的学习路线图 程序员的主要工作是 ...
- iOS copy 和 mutableCopy 学习
(参考 iOS 52个技巧学习心得笔记 第二章 对象 , 消息, 运行期)的对象部分 关于Copy 有个经典问题”大部分的时候NSString的属性都是copy,那copy与strong的情况下到底 ...
- IOS开发之XCode学习009:UIViewController使用
此文学习来源为:http://study.163.com/course/introduction/1002858003.htm 此工程文件实现功能: 通过点击屏幕事件,调用ViewController ...
- iOS 二维码 学习
这段时间忙着交接工作,找工作,找房子,入职,杂七杂八的,差不多一个月没有静下来学习了.这周末晚上等外卖的时间学习一下二维码的制作与扫描. 项目采用OC语言,只要使用iOS自带的CoreImage框架, ...
- ios游戏开发--cocos2d学习(1)
学习cocos2d需要一定的编程基础,最好了解objective-c的语法.至于下载和安装的过程网上有很多,这里不多介绍,直接进入项目的学习. 创建一个cocos2d项目,直接运行,效果如图: 左下角 ...
随机推荐
- 大数据(6) - MapReduce简易介绍入门
一 MapReduce入门 MapReduce定义(简单来说就是hadoop的数据分析核心,理解其中的原理,则可以分析聚合一切需求) Mapreduce是一个分布式运算程序的编程框架,是用户开发“基于 ...
- 在linux中使用sqlplus的上下左右箭头的方法
在linux下面使用sqlpus连接数据库处理,实在不是很方便,还好有一个工具rlwrap,通过这个能够调用历史命令和回调功能,能够极大的提高效率. 1. 下载 从http://utopia.know ...
- 集合Set映射一对多(使用xml文件)
如果持久化类设置了包含实体引用的对象,则需要使用一对多关联来映射集合(Set)元素. 我们可以通过任意一个Set集合来映射这个列表对象. 下面来看看看设置对象的持久化类. 在这种情况下,一个问题可以有 ...
- hdu 1956(混合图的欧拉回路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1956 思路:先将无向边定向,比如1<->3,可以定它的方向为1->3,1的出度++, ...
- python静态网页爬虫之xpath(简单的博客更新提醒功能)
直接上代码: #!/usr/bin/env python3 #antuor:Alan #-*- coding: utf-8 -*- import requests from lxml import e ...
- ios中的coredata
本文转载至 http://blog.csdn.net/chen505358119/article/details/9334831 分类: ios2013-07-15 18:12 12449人阅读 评论 ...
- 【BZOJ4247】挂饰 背包
[BZOJ4247]挂饰 Description JOI君有N个装在手机上的挂饰,编号为1...N. JOI君可以将其中的一些装在手机上. JOI君的挂饰有一些与众不同——其中的一些挂饰附有可以挂其他 ...
- GridView中给DropDownList动态绑定数据,及选择列表值后自动更新数据库
protected void sgvFile1_RowDataBound(object sender, GridViewRowEventArgs e) { DropDownList ddlAM = ( ...
- go build说明
go build命令用于编译我们指定的源码文件或代码包以及它们的依赖包. 例如,如果我们在执行go build命令时不后跟任何代码包,那么命令将试图编译当前目录所对应的代码包.例如,我们想编译goc2 ...
- C# MD5加密与校验 引用
using System; using System.Security.Cryptography; using System.Text; class Example { // Hash an inpu ...