iOS 简单粗暴的浅谈类与对象


简介:

在Objective-C语言中,每一个地方我们都在面对类与对象,比如说一个控件、一个字符串、一张图片、包括我们所说的NSObject等等都可以看做对象,那么Objective-C的类呢也就是所谓的Class,Class也是一个对象,称为类对象,既然无论何时何地面对对象,哈哈那么你对你的对象了解多少呢?是不是又开始想淫荡的去研究一下???

正文:

类与对象在Objective-C中算是非常基本的东西,可以说无时无刻不遇到,创建的任何东西都可以认为是一个对象,在无时无刻的不创建类,那么接下来我们将简单探讨一下类与对象

首先来看一下class与object在Objective-C的定义,路径为/usr/include/objc/objc.h:

typedef struct objc_class *Class;//一个不透明含糊的类型,表示一个Objective-C类

typedef struct objc_object {//表示类的实例

Class isa;

} *id;//指向类实例的指针

我们可以看到Class是一个objc_class结构类型的指针,文件中注释为An opaque type that represents an Objective-C class;id(任意对象)是一个objc_object结构类型的指针,文件中注释为A pointer to an instance of a class;

以下是objc_class结构体的一个体现,这里我们来挨个注释:

struct objc_class

{

struct objc_class* isa;

struct objc_class* super_class;

const char* name;

long version;

long info;

long instance_size;

struct objc_ivar_list* ivars;

struct objc_method_list** methodLists;

struct objc_cache* cache;

struct objc_protocol_list* protocols;

};

isa指针:是一个类型为objc_class指针,是的和class是一个类型的指针,那么我们是不是可以这样说:一个以objc_class指针指向的所有东西都可以当作一个objc对象来对待

super_class:父类,那么我们知道所有的类都继承于NSObject或者NSProxy,那么NSObject是所有类的父类唠,那NSObject或者NSProxy的super_class是什么呢,我们可以直接从项目直接打印下试试看!

NSLog(@"%@",NSObject.superclass); 

2017-10-09 16:32:56.195134+0800 MetaClass[17818:4363641] (null)

由此可见如果一个类的根类为NSObject或者NSProxy,那么这个类的super_class为我们打印的值为null

在《深入浅出Cocoa教程》中提到

好,先中断一下其他类结构成员的介绍,让我们理清一下在继承层次中,子类,父类,根类(这些都是普

通class)以及其对应的metaclass的isa与super_class之间关系:

规则一:类的实例对象的isa指向该类;该类的isa指向该类的metaclass;

规则二:类的super_class指向其父类,如果该类为根类则值为NULL;

规则三:metaclass的isa指向根metaclass,如果该metaclass是根metaclass则指向自身;

规则四:metaclass的super_class指向父metaclass,如果该metaclass是根metaclass则指向

该metaclass对应的类;


如果一个类的跟类为NSObject或者NSProxy那么是不是可以把她的super_class理解为他自己本身呢?

name:const char* name;一个c类型的字符串,用来表示类的名字

在运行时可以通过方法id objc_getClass(const char *aClassName)来得到这个类的名字,通过id objc_getMetaClass(const

char *aClassName)来得到该类的metaclass

version:版本信息,初始默认值为0

当然也可以在运行时通过方法class_setVersion修改版本信息,通过class_getVersion来得到版本信息

info:此处同样来引用《深入浅出Cocoa教程》中的解读:

供运行期使用的一些位标识。有如下一些位掩码:

CLS_CLASS (0x1L)表示该类为普通class,其中包含实例方法和变量;

CLS_META (0x2L)表示该类为metaclass,其中包含类方法;

CLS_INITIALIZED (0x4L)表示该类已经被运行期初始化了,这个标识位只被objc_addClass所设置;CLS_POSING (0x8L)表示该类被pose成其他的类;(poseclass在ObjC 2.0中被废弃了);CLS_MAPPED (0x10L)为ObjC运行期所使用

CLS_FLUSH_CACHE (0x20L)为ObjC运行期所使用

CLS_GROW_CACHE (0x40L)为ObjC运行期所使用

CLS_NEED_BIND (0x80L)为ObjC运行期所使用

CLS_METHOD_ARRAY (0x100L)该标志位指示methodlists是指向一个objc_method_list还是

一个包含objc_method_list指针的数组;

instance_size:这个类实例变量的大小,内包含了从父类继承下来的实例变量

ivars:可以看出这个是一个指向objc_ivar_list类型的指针,用处呢是用来存储每一个实例变量的地址

methodLists:此处和info的解读方式一样,参考《深入浅出Cocoa教程》,讲的很不错

与info的一些标志位有关,CLS_METHOD_ARRAY标识位决定其指向的东西(是指向单个objc_method_list还是一个objc_method_list指针数组),如果info设置了CLS_CLASS则objc_method_list存储实例方法,如果设置的是CLS_META则存储类方法;

cache:同样道理指向objc_cache的指针,cache可以看出这个是一个缓存相关的,那么用来缓存什么呢,这就是用来存储最近使用方法的一个东西,来提高效率,优化

protocols:当然可以看出这一个objc_protocol_list的指针,用来存储声明遵守的正式协议

总结:

Objective-C,每一个地方我们都在面对类与对象,很明显的可以看出Objective-C提供了运行时期限来创造定义objc_class数据结构的机会,从苹果给我们的一些机制解释或者方法上可以灵活的运用与处理,有兴趣一起交流学习的小伙伴,欢迎加入技术交流q群:150731459,一起进步!共同努力!有理解不正确和不合适的地方换欢迎大家指出,互相学习!

最后送出分享几句话:

当交流有矛盾的时候一定要及时沟通,假如来说两个人有矛盾一定要两个人单独在一起谈,谦卑,理解,放下心态谈通了为止!

有一句话叫三人行必有我师,话糙理不糙,互相学习,共同进步!一起加油吧!

C博客地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容