有人问我 这个问题 回答错了,题干大概是说 [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 wellif(self){//TODO:
        }return self;
}

我这么写,应该很容易看出来了吧,

第一种情况,通过 super 编译指令开始回溯,如果还有重写回溯重写 然后继续回溯 一直到基类.

第二段代码 则是再次调用当前方法 然后陷入了死循环.(类似这种情况就不能滥用, 并且 我们知道 在 初始化方法里面 尽量不要用点语法 ,不一定什么时候 就造成循环引用, 当然我们知道有这个坑,自己有避免的机制也无所谓啦)

第三段代码 我们看到 这个时候 方法名不一样  initWithNew: 和 initWithFrame: ,所以 用super  self 都行 ,self 也最终会走到 super 的方法. 大家也可以在工程里面写这几个方法 然后点击进去,或者debug一下看看走的每一步.

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

慢慢积累吧 日子长着呢

转载于:https://www.cnblogs.com/someonelikeyou/p/5506360.html

iOS self 和 super 学习相关推荐

  1. IOS中触摸事件学习

    IOS中触摸事件学习 1. 事件的声明周期 2. 系统相应阶段 3. APP响应阶段 4. 触摸.事件.响应者 4.1 UITouch(触摸) 4.2 UIEvent(事件真身) 4.3 UIResp ...

  2. ios 11 CORE ML 学习入门

    导语:在刚刚过去的WWDC上,苹果发布了Core ML这个机器学习框架.现在,开发者可以轻松的使用Core ML把机器学习功能集成到自己的应用里,让应用变得更加智能,给用户更牛逼的体验. 苹果在 iO ...

  3. [iOS]关于零基础学习iOS开发的学习方法总结

    关于零基础学习iOS开发的学习方法总结 最近很多零基础来参加蓝鸥培训的学生经常会问到一些学习方法的问题,就如下我自己见过的好的学习方法一起讨论一下. 蓝鸥iOS开发技术的学习路线图 程序员的主要工作是 ...

  4. iOS开发通过微信学习WCDB(二)

      通过<iOS开发通过微信学习WCDB(一)>这篇博客,相信大家对WCDB已经有了一个简单的了解和认识.这篇文章主要是为了进一步深入的学习 ###数据库加密   上篇文章中提到了,自己在 ...

  5. iOS开发Swift语言学习教程-欧阳坚-专题视频课程

    iOS开发Swift语言学习教程-16345人已学习 课程介绍         Swift这套视频是针对有Objective-C/iOS基础,想转成Swift开发的学习视频,视频中从Swift语法,结 ...

  6. ios 图像坐标系_iOS学习笔记(1)-iPhone分辨率和坐标系

    终于决定开始学习ios开发了,很久之前有过一次ios开发培训,但是做完作业就落下了,一直没有再捡起.想到如今ios开发如火如荼,再不学习真的要掉队了,希望能督促自己在2个月内完成ios开发的基础学习以 ...

  7. iOS逆向抖音学习滤镜,你知道吗?

    逆向不只可以让我娱乐别人的APP,我们也可以从别人的APP中学到一些东西,有时候我们会为了某种实现去逆向.由于前段时间公司项目需要写一个类似抖音的滤镜,不免就对抖音起了好奇心.最后效果如下: IMG_ ...

  8. 2021新出iOS开发程序员学习路线,涵盖大部分iOS知识体系【不会没收藏吧!】

    这个栏目将持续更新--请iOS的小伙伴关注! 整理不易,如果您觉得还不错,麻烦在文末 "点个赞" 或者 评论 "Mark",谢谢您的支持 1.字符串常用方法 字 ...

  9. 2011斯坦福大学iOS应用开发教程学习笔记(第七课)Pad和iPhone的通用程序

    第七课的主要内容:iPad 和iPhone的通用程序 这节课主要讲如何在一个程序里适配iPad 和iPhone. 内容简介 1.UIToolbar上面放的都是UIBarButtonItem 可以参考i ...

最新文章

  1. CQOI2015 任务查询系统
  2. hadoop day 3
  3. 苏宁“砍价团”高可用、高并发架构实践
  4. 科研 | Nature:新型土壤细菌具有多种合成次级代谢物的基因
  5. c语言调用shell脚本或命令
  6. httpHandlers和httpModules接口介绍 (7)
  7. vijos P1740 聪明的质检员
  8. 5827. 检查操作是否合法
  9. Educational Codeforces Round 112 (Rated for Div. 2)(A-D)
  10. Ubuntu 无法获得锁
  11. 蔚来资本宣布完成约4亿美元二期基金募集
  12. Android解包命令:unpackbootimg与打包命令:mkbootimg使用
  13. python uwsgi_Python uWSGI 安装配置
  14. Swift-初始化失败处理方法
  15. OpenCV人脸识别
  16. python 文件内容对比_用python进行文件比对
  17. 计算机网络 - mbed TLS
  18. python获取域名对应的ip_Python实现通过解析域名获取ip地址的方法分析
  19. java free hd 798,[https://www.798ziyuan.com/]Java入门级项目全程实录V2.0
  20. android视频拷到iphone6,苹果和安卓手机保存B站视频到U盘方法介绍

热门文章

  1. Visual Studio IDE环境下利用模板创建和手动配置CUDA项目教程
  2. ThinkPHP 3.2 支付宝即时到账接口开发
  3. CentOS系统配置solr
  4. 【随机过程】随机过程之泊松过程的推广
  5. 区分Activity的四种加载模式(转)
  6. 利用AutoHotkey实现Vim和Excel的数据传递
  7. Vue学习----webpack跨域问题proxyTable
  8. ACM组队训练记录(Grooming)
  9. [c#菜鸟]lambda表达式
  10. awk、变量、运算符、if多分支