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一下看看走的每一步.

学到什么程度 都会有不懂的问题,也许对别人很简单,自己才会. 丢脸不要紧 只要敢去找回你的颜.

慢慢积累吧 日子长着呢

时间: 2024-10-12 20:10:37

iOS self 和 super 学习的相关文章

IOS开发-UI学习-sqlite数据库的操作

IOS开发-UI学习-sqlite数据库的操作 sqlite是一个轻量级的数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了,而且它的处理速度比Mysql.PostgreSQL这两款著名的数据库都还快,在ios和安卓app中常用来完成对数据进行离线缓存的处理,如新闻数据的离线缓存. 它的基本操作步骤是: 1.先加入sqlite开发库libsqlite3.dylib, 2.新建或打开数据库, 3.创建数据表, 4.插入数据, 5.查询数据并打印, 6.关闭数据库, 具体操作步

《iOS应用逆向工程》学习笔记(四)iOS程序类型

越狱iOS中最常见的程序有Application, Dynamic Library和Daemon三类. 1.Application 除了传统意义上的App外,越狱iOS平台上还有两种App形式的存在:WeeApp(依附于NotificationCenter的App)和PreferenceBundle(依附于Settings的App),常见于Cydia平台. 普通App的bundle中存放的是可执行程序和所需资源,而framework的bundle中存放的是动态链接库. 主要关注App中的三个部分

《iOS应用逆向工程》学习笔记(五)初尝越狱插件OpenSSH

首先在越狱机子上装上OpenSSH插件,然后查看设备的IP地址,这里假设为192.168.xxx.xxx. 然后用Mac上的Terminal通过Open SSH连接到设备上(初次登录密码是alpine,必须立即修改,否则任何人都可以连接到你的机子上搞破坏). 连接命令为:ssh [email protected]设备IP地址 修改密码命令为:passwd 例如: $ ssh [email protected] The authenticity of host '192.168.xxx.xxx (

《iOS应用逆向工程》学习笔记(六)使用dumpdecrypted砸壳

本来是打算用AppCrackr砸壳的,结果砸壳都是失败的,开始以为是App的加密太厉害了,后来才知道是因为AppCrackr太暴力了,引起公愤,结果被人投诉招致核心功能被迫关闭了. 幸好在RE官网搜到一个用dumpdecrypted砸壳的帖子.下面是我砸壳的经历. 一.造锤 1.下载dumpdecrypted源码 下载地址:https://github.com/stefanesser/dumpdecrypted/archive/master.zip,接着在Mac中解压. 2.确认iOS设备的版本

《iOS应用逆向工程》学习笔记(二)iOS系统目录结构(部分)

首先下载个iFile,可以用来直观地查看iOS系统的目录结构. 下面记录一些关键的iOS目录结构: /var:"variable"的简写,存放一些经常更改的文件,例如日志.用户数据.临时文件等.其中/var/mobile/Applications下存放了所有App Store App. /Applications:存放所有的系统App和来自Cydia的App,不包括App Store App.越狱的过程把/Applications变成了一个符号链接,实际指向/var/stash/App

《iOS应用逆向工程》学习笔记(三)iOS文件权限

一个组可以包含多个用户,一个用户可以属于多个组. iOS中的每个文件都有一个属主用户和属主组.每个文件都具有一系列的权限. 在iOS中用3bit表示文件的使用权,从高位到低位分别是r(read), w(write), x(execute)权限. 文件和用户的关系存在三种可能性:(1)此用户是属主用户:(2)此用户不是属主用户,但在属主组里:(3)此用户既不是属主用户,也不在属主组里. 例如: 111101101代表rwxr-xr-x,其8进制为755,它表示该文件的属主用户拥有r, w, x权限

IOS开发-OC学习-常用功能代码片段整理

IOS开发-OC学习-常用功能代码片段整理 IOS开发中会频繁用到一些代码段,用来实现一些固定的功能.比如在文本框中输入完后要让键盘收回,这个需要用一个简单的让文本框失去第一响应者的身份来完成.或者是在做与URL有关的功能时,需要在Info.plist中添加一段代码进而实现让网址完成从Http到Https的转换,以及其他的一些功能. 在从一个新手到逐渐学会各种功能.代码.控件.方法如何使用的过程中,也在逐渐积累一些知识,但是一次总不会把这些东西都深刻记住并完全理解.所以在这儿记录下这些东西,用来

iOS动画详解(学习动画看这一篇就够了)

iOS动画详解(学习动画看这一篇就够了) 一.基础知识 CAAnimation.png 二.CABasicAnimation 1. 动画的属性和解释 2.属性值的解释 repeatCount : 如果在swift中需要一直不断重复:Float.infinity,OC:HUGE_VALF timingFunction: timingFunction.png kCAMediaTimingFunctionLinear--在整个动画时间内动画都是以一个相同的速度来改变.也就是匀速运动.一个线性的计时函数

IOS 关键字self,super,copy, retain, assign , readonly , readwrite, nonatomic、 @synthesize、@property、@dynamic

IOS 关键字self,super,copy, retain, assign , readonly , readwrite, nonatomic.                     @synthesize.@property.@dynamic #synthesize关键字: 根据@property设置,自动生成成员变量相应的存取方法,从而可以使用点操作符来方便的存取该成员变量 . @implementation 关键字,表明类的实现 @end 结束 self 关键字 :类似于java中的t