6 OC中 isa 和 superclass 的总结
目录
一 关于isa 和 superclass 的总结
二 为什么基类的metaclass 的superclass 指向的是基类的类
三 isa 的细节问题
总结如下:
- instance 的isa 指向是class
- class 的isa 指向是metaclass
- metaclass 的isa指向是基类的imetaclass
- class 的superclass 指向的是父类的class
- class如果没有父类,superclass 指向的是nil
- metaclass 的superclass 指向的是父类的metaclass
- 基类的metaclass 的superclass 指向的是基类的类
1 所以实例对象方法的调用轨迹是
isa 找到class,通过superclass 一直往上寻找,直到找到对应的方法,如果找不到,就结束,抛出异常
2 类对象方法调用的轨迹是
isa 找到metaclass,方法不存在,通过superclass 一直寻找,如果找不到,就结束,抛异常
二 为什么基类的metaclass 的superclass 指向的是基类的类
Person 类的类方法和 NSObject 类的类方法都没有实现,但是Person 类 和 NSObject 调用类方法却没有崩溃产生?
从上图可以看出来
正式因为metaclass的superclass 指向的是基类的类,因为基类中有同名的test 方法,所以没有崩溃产生。
因为代码的本质是
[Person test];
objc_msgsend([Person class],@selector(test));
只是告诉给这个类发送消息,调用test方法,并没有告知是+ 方法 或者 - 方法
oc 调用方法的本质就是通过方法名字去寻找,不会区分类方法和实例对象方法
#import <Foundation/Foundation.h>NS_ASSUME_NONNULL_BEGIN@interface NSObject (Test)+ (void)test;@endNS_ASSUME_NONNULL_END#import "NSObject+Test.h"@implementation NSObject (Test)// 不实现NSObject 类的 类方法 test//
//+ (void)test{
//
// NSLog(@"+[Person test] -- %p",self);
//}// 但是实现NSObject 的对象方法
- (void)test{NSLog(@"-[Person test] -- %p",self);
}@end
#import <Foundation/Foundation.h>
#import "NSObject+Test.h"@interface Person : NSObject+ (void)test;@end@implementation Person// 不实现person 类的 类方法 test//+ (void)test{
//
// NSLog(@"+[Person test] -- %p",self);
//}@endint main(int argc, const char * argv[]) {@autoreleasepool {// insert code here...NSLog(@"Hello, World!");[Person test];[NSObject test];}return 0;
}
三 isa 的细节问题
实例对象的isa 指向 class,那么isa 中存在的地址值是否就是class 的地址值呢?
其实在64位以前,确确实实isa的中存在的地址值就是class的地址值,但是在64位以后,要进行一次与运算,才能获取class 的地址值
但是superclass 指针是不存在这个问题的
相关文章:

opencv下指定文件夹下的图片灰度化(图片的读取与保存)-------简单记录
对于此功能其实很简单:主要是在c方面的字母数字的拼接问题存在一定的问题。C数字字母拼接问题: 1 #include <fstream> 2 #include <string> 3 #include <iostream> 4 #include "highgui.h" 5 #include <cv.h> 6 #…

css菜单缓慢滑动_如何使用HTML,CSS和JavaScript构建滑动菜单栏
css菜单缓慢滑动by Supriya Shashivasan由Supriya Shashivasan 如何使用HTML,CSS和JavaScript构建滑动菜单栏 (How to build a sliding menu bar using HTML, CSS and JavaScript) A menu is what you look for when you land at a website. It has options and gi…

素数环问题---深度搜索遍历
1264: 素数环 时间限制: 1 Sec 内存限制: 128 MB提交: 29 解决: 8[提交][状态][讨论版]题目描述 有一个长度为n的环形序列由1,2,3,...,n组成,环中相邻两个整数和均为素数。你需要找到所有满足条件的环。输入 输入n表示环的长度(n<16)输出…

android之Notification通知
我们在用手机的时候,如果来了短信,而我们没有点击查看的话,是不是在手机的最上边的状态栏里有一个短信的小图标提示啊?你是不是也想实现这种功能呢?今天的Notification就是解决这个问题的。 package cn.com.chenzheng_…

7 OC 中class 类的结构
目录 一 OC 中class 的结构 https://opensource.apple.com/tarballs/objc4/ 在最新的objc源码中 化繁就简来看的话 是以下结构 struct objc_class : objc_object {objc_class(const objc_class&) delete;objc_class(objc_class&&) delete;void operator(con…

apple id无法创建_我们如何使用Apple的学习框架来创建我们的第一个应用程序
apple id无法创建by Jonata Corra由JonataCorra 我们如何使用Apple的学习框架来创建我们的第一个应用程序 (How we used Apple’s learning framework to create our first app) After one month of work, my team and I finished the first version of Echo, our tracker iOS…

个人作业1:小学四则运算——基于控制台
a.需求分析: 自动生成小学四则运算题目的命令行 “软件”,满足以下需求: 除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 1/8 7/24运算符为 , −, , 并且要求能处理用户…

getchar返回int类型
#include <stdio.h> /* copy input to output; 2nd version */main(){int c;c getchar();while(c ! EOF){putchar(c);c getchar();}} 直觉告诉我getchar返回值应该是char类型的,这个地方为什么不能用char类型来存储getchar()的返回值呢? 其实文中…

8 iOS中KVO 的本质
前言本质 Automatic key-value observing is implemented using a technique called isa-swizzling 这计划的意思就是 自动的键值观察的实现基于 isa-swizzling 原理 1.KVO是基于runtime机制实现的 2.当某个类的属性对象第一次被观察时,系统就会在运行期动态地创…

完成工作表-使用Google Spreadsheets作为数据后端
by Gilad Dayagi通过吉拉德达亚吉 完成工作表-使用Google Spreadsheets作为数据后端 (Get Sheet Done — using Google Spreadsheets as your data backend) If you want to rapidly prototype your next web apps, try using Google Spreadsheets as your data backend.如果您…

BIEE-CSS样式大全
字体属性:(font) 大小 {font-size: x-large;}(特大) xx-small;(极小) 一般中文用不到,只要用数值就可以,单位:PX、PD 样式 {font-style: oblique;}(偏斜体) italic;(斜体) normal;(正常) 行高 {line-height: normal;}(正常) 单位&…

基于verilog的FPGA编程经验总结(XILINX ISE工具)
1.用ISE仿真的时候.所用变量一定要初始化. ISE默认初始量为"XXXXX", 而Quarters是默认为"00000"的, 其实实际上, 下到FPGA里后也是默认为0的,只是可以说ISE严谨得令人DT吧.比如说用一个累加器, result ABresult ,必须保证在某一刻A, B, result都为定值时,…

6 OC 中的isa 指针
目录 一 isa 指针 二 类对象中的superclass 一 isa 指针 isa 指针 ,OC 中的对象都是有的 如下图所示,实例对象isa 指针指向 类对象,类对象的isa 指针指向 元类对象 二 类对象中的superclass superclass 有什么用呢? 比如说创…

btf-raft共识算法_了解Raft共识算法:学术文章摘要
btf-raft共识算法by Shubheksha通过Shubheksha 了解Raft共识算法:学术文章摘要 (Understanding the Raft consensus algorithm: an academic article summary) This post summarizes the Raft consensus algorithm presented in the paper In Search of An Underst…

iOS asset 中定义颜色,xib中便捷访问
在aseet 中定义一个颜色 这样就可以在xib 中访问颜色了,这样就不用重复的去输入

三种序列化方式性能比较
一下代码比较了二进制序列化、xml序列化、Protobuf序列化的运行时间,可是代码显得十分冗余,是否有大神可以指点一二,万分感谢 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; usi…

mac mini 装UBUNTU后没有WIFI解决办法
1、在终端中运行如下命令,重新安装b43相关的全部驱动和firmware: 复制代码代码如下:sudo apt-get install bcmwl-kernel-source #Broadcom 802.11 Linux STA 无线驱动源sudo apt-get install broadcom-sta-commonsudo apt-get install broadcom-sta-sourcesudo apt-…

区块链c端应用小程序_区块链如何真正起作用? 我建立了一个应用程序向您展示。...
区块链c端应用小程序by Sean Han通过肖恩韩 区块链如何真正起作用? 我建立了一个应用程序向您展示。 (How does blockchain really work? I built an app to show you.) According to Wikipedia, a blockchain is:根据维基百科,一个区块链是࿱…

HDU 4913 Least common multiple
/* hdu4913 Least common multiple http://acm.hdu.edu.cn/showproblem.php?pid4913 离散化 线段树 统计逆序数思想 tips: 1、线段树中一定要到处都取模,否则wa。。。 2、lazy是乘积的形式出现,不是加和*/ #include <cstdio> #include <algori…

JS ES6 实用笔记
微信小程序开发交流qq群 581478349 承接微信小程序开发。扫码加微信。 这篇博文我会一直更新。 一.导出导入的两中方式 1.export //demo1.js export const a 6 导入语法为: import {a} form demo1 2.export default //demo2.js export default const b 6 …

extjs editgrid增加一行
Ext.onReady(function(){ /* * EditorGridPanel的工作过程 * 1、用户点击单元格 * 2、单元格按照预设的组件显示单元格的内容并处于编辑状态 * 3、离开单元格的编辑状态 * 4、更新编辑后的内容,出现三角号表示已经被修改过 * 5、程序内部变化:将记录设置…

unity 骨骼击碎_保证击碎$ 100挑战的创新策略
unity 骨骼击碎by Glenn Gonda由Glenn Gonda 保证击碎$ 100挑战的创新策略 (A Creative Strategy Guaranteed to Crush the $100 Challenge) Before I became a software engineer, I made my living as a recording studio engineer. I have a non-traditional background an…

mac下安装libpng环境
用go写一个爬虫工具时需要使用一个go的库,而这个库有需要使用libpng库,不然编译就会提示说 png.h找不到等之类的信息,于是想到应该和windows一样需要安装gcc环境,然后让gcc里安装libpng这个库, 解决办法: 终…

linux oracle修改编码utf8
$ sqlplus /nolog SQL> connect sys/oracle as sysdba SQL> startup 如何设置ORACLE数据库的编码(ZHS16GBK)修改成UTF8 SQL> shutdown immediate; SQL> startup mount; SQL> alter system enable restricted session; SQL> alter sy…

Vue.js 数据绑定渲染Demo
微信小程序开发交流qq群 581478349 承接微信小程序开发。扫码加微信。 <div id"app">{{ message }} </div>var app new Vue({el: #app,data: {message: Hello Vue!} })Hello Vue!

angular搭建项目步骤_建立健康的Angular项目应采取的步骤
angular搭建项目步骤by Ashish Gaikwad通过Ashish Gaikwad 建立健康的Angular项目应采取的步骤 (Steps you should take to build a healthy Angular project) 使用Jenkins SonarQube创建您的“ Angular Fitbit” (Create your “Angular Fitbit” with Jenkins SonarQube) …

数据库的三大范式和事物
来源:http://blog.csdn.net/w__yi/article/details/19934319 1.1 第一范式(1NF)无重复的列 1.2 第二范式(2NF)属性完全依赖于主键 [ 消除部分子函数依赖 ] 1.3 第三范式(3NF)属性不依赖于其它非…

过滤器和包装器
作者:禅楼望月 过滤器要做的事情 请求过滤器 完成安全检查 重新格式化请求首部或体 建立请求审计或日志响应过滤器 压缩响应流 追加或修改响应流 创建一个完全不同的响应注意不能把过滤器的顺序依赖性硬编码进程序中,它应该由DD控制。 过滤器很像Servlet…

Missing space before value for key 'path'vue.js解决空格报错
微信小程序开发交流qq群 581478349 承接微信小程序开发。扫码加微信。 找到 webpack.base.config.js文件注释掉下面的东西!! module: { rules: [ /*{ test: /\.(js|vue)$/, loader: eslint-loader, enforce: "p…

现代hy-9600音响_从音响工程师到软件工程师-为什么我要学习编码
现代hy-9600音响by Kalalau Cantrell通过Kalalau Cantrell 从音响工程师到软件工程师-为什么我要学习编码 (From Sound Engineer to Software Engineer — Why I’m Learning to Code) I seriously started teaching myself to code several months ago. I say “seriously” …