ios是谁开发的,ios用什么开发

2020-10-13 阅读 彭海儿整理

内容简介:ios开发难吗我们可以在/usr/include/objc/objc中找到类和对象的定义。H和运行时。H:typedef struct objc_class*类;typedeios 开发教程...

我们可以在/usr/include/objc/objc.h和runtime.h中找到对class与object的定义:typedefstructobjc_class*Class;typedefstructobjc_object{Classisa;}*id;Class是一个objc_class结构类型的指针;而id(任意对象)是一个objc_object结构类型的指针,其第一个成员是一个objc_class结构类型的指针。

注意这里有一关键的引申解读:内存布局以一个objc_class指针为开始的所有东东都可以当做一个object来对待!那objc_class又是怎样一个结构体呢?且看:structobjc_class{structobjc_class*isa;structobjc_class*super_class;constchar*name;longversion;longinfo;longinstance_size;structobjc_ivar_list*ivars;structobjc_method_list**methodLists;structobjc_cache*cache;structobjc_protocol_list*protocols;};objc_class结构体的各成员介绍如下:isa:是一个objc_class类型的指针,看到这里,想起我前面的引申解读了没?内存布局以一个objc_class指针为开始的所有东东都可以当做一个object来对待!这就是说objc_class或者说类其实也可以当做一个objc_object对象来对待!对象是对象,类也是对象,是不是有点混淆?别急,ObjC发明(or重用)了一个术语来区分这两种不同的对象:类对象(classobject)与实例对象(instanceobject)。

OK,名称混淆的问题解决,下面我将使用这两个术语来区分不同的对象,而使用对象这一术语来泛指所有的对象。

ObjC还对类对象与实例对象中的isa所指向的类结构作了不同的命名:类对象中的isa指向类结构被称作metaclass,metaclass存储类的static类成员变量与static类成员方法(开头的方法);实例对象中的isa指向类结构称作class(普通的),class结构存储类的普通成员变量与普通成员方法(-开头的方法)。

super_class:一看就明白,指向该类的父类呗!如果该类已经是最顶层的根类(如NSObject或NSProxy),那么super_class就为NULL。

好,先中断一下其他类结构成员的介绍,让我们厘清一下在继承层次中,子类,父类,根类(这些都是普通class)以及其对应的metaclass的isa与super_class之间关系:规则一:类的实例对象的isa指向该类;该类的isa指向该类的metaclass;规则二:类的super_class指向其父类,如果该类为根类则值为NULL;规则三:metaclass的isa指向根metaclass,如果该metaclass是根metaclass则指向自身;规则四:metaclass的super_class指向父metaclass,如果该metaclass是根metaclass则指向该metaclass对应的类;好吧,文字总是那么乏力,有图有真相!

那么class与metaclass有什么区别呢?class是instanceobject的类类型。

当我们向实例对象发送消息(实例方法)时,我们在该实例对象的class结构的methodlists中去查找响应的函数,如果没找到匹配的响应函数则在该class的父类中的methodlists去查找(查找链为上图的中间那一排)。

如下面的代码中,向str实例对象发送lowercaseString消息,会在NSString类结构的methodlists中去查找lowercaseString的响应函数。

NSString*str;[strlowercaseString];metaclass是classobject的类类型。

当我们向类对象发送消息(类方法)时,我们在该类对象的metaclass结构的methodlists中去查找响应的函数,如果没有找到匹配的响应函数则在该metaclass的父类中的methodlists去查找(查找链为上图的最右边那一排)。

如下面的代码中,向NSString类对象发送stringWithString消息,会在NSString的metaclass类结构的methodlists中去查找stringWithString的响应函数。

[NSStringstringWithString:@str];好,至此我们明白了类的结构层次,让我们接着看类结构中的其他成员。

name:一个C字符串,指示类的名称。

我们可以在运行期,通过这个名称查找到该类(通过:idobjc_getClass(constchar*aClassName))或该类的metaclass(idobjc_getMetaClass(constchar*aClassName));version:类的版本信息,默认初始化为0。

我们可以在运行期对其进行修改(class_setVersion)或获取(class_getVersion)。

info:供运行期使用的一些位标识。

有如下一些位掩码:CLS_CLASS(0x1L)表示该类为普通class,其中包含实例方法和变量;CLS_META(0x2L)表示该类为metaclass,其中包含类方法;CLS_INITIALIZED(0x4L)表示该类已经被运行期初始化了,这个标识位只被objc_addClass所设置;CLS_POSING(0x8L)表示该类被pose成其他的类;(poseclass在ObjC2.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的指针,存储每个实例变量的内存地址,如果该类没有任何实例变量则为NULL;methodLists:与info的一些标志位有关,CLS_METHOD_ARRAY标识位决定其指向的东西(是指向单个objc_method_list还是一个objc_method_list指针数组),如果info设置了CLS_CLASS则objc_method_list存储实例方法,如果设置的是CLS_META则存储类方法;cache:指向objc_cache的指针,用来缓存最近使用的方法,以提高效率;protocols:指向objc_protocol_list的指针,存储该类声明要遵守的正式协议。

总结:ObjC为每个类的定义生成两个objc_class,一个即普通的class,另一个即metaclass。

我们可以在运行期创建这两个objc_class数据结构,然后使用objc_addClass动态地创建新的类定义。

作者给您推荐的内容
  1. 现在的生活节奏太快,人们很容易就产生了疲劳感,适时的停下来休息游戏一下是一个不错的选择,比如玩一些益智类的解谜游戏,今天我们就来说说最囧烧脑解谜游戏第43-49关怎么过关。01、在...

  2. u盘重装系统win7win7家族编辑知道很多朋友都想安装传统的ghostwin7系统,但也知道很多朋友不知道如何安装传统的ghostwin7系统。所以编辑决定帮你,教你如何安装传统windows系统...

  3. phpMyAdmin2.11.0安装攻略...

  4. PS如何利用参考线,一键切片图片?下面我们就来看一下是如何操作的吧,希望能够帮助到大家。01、首先,在电脑上找到Photoshop软件,然后点击打开软件。02、打开Photoshop之后,点击菜单栏总的文...

  5. 直通车余额如何退款对于直通车的账户诊断功能更新,不知卖家知不知道。这里有一个小版本供您仔细分析,诊断功能更新的直通车帐户,以及一些驾驶技巧!官方列出的五种诊断工具...

  6. 电脑开机进不了系统,停在如图一个黑底白字的界面不动,不外乎两种情况,一种是系统出问题了,找不到启动文件,这种情况重装系统即可。另一种就是硬盘无法被检测到。下面我说一下第二种...

  7. win10睡眠无法唤醒黑屏有网友问小编如何设置睡眠唤醒?事实上,如何为win7设置睡眠唤醒是一件非常简单的事情,如何做到呢?让小编给大家介绍一下win7设置睡眠唤醒密码的方法。一。...

  8. 1右键单击桌面的空白区域并选择小部件选项;2。widget界面将弹出。在小部件中,您可以看到一个CPU仪表板,然后双击它;3。双击后,您可以看到CPU仪表小部件被教你如何通过win7系统自带工具实时...

  9. 笔记本电脑静音了怎么办呢?下面小编来告诉大家该怎么办。01、首先,我们点击电脑桌面左下角的微软按钮,弹出的界面,我们点击设置;02、弹出的界面,我们点击系统;03、弹出的界面...

  10. windows7升级sp1深技术windows 7 sp1系统安装过程中帮助用户自动删除了分区下的病毒,保证了系统的安全使用,避免了预安装数据备份,且无需激活,可以直接使用,希望您能喜欢windows7旗舰...