仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1846|回复: 19
打印 上一主题 下一主题

[学习教程] IOS设计Objective-C 中的 Meta-class 是甚么?仓酷云

[复制链接]
飘飘悠悠 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:37:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
最重要的就是UINavigationController他是一层一层推进view的打开iPhone里的联系人每点一个联系人屏幕就会像右推到下一个界面这就是UINavigationController在做的事UINavigationController在这篇文章中,我存眷的是Objective-C中的一个生疏的观点——meta-class。在Objective-C中的每一个类都有一个相干联的meta-class,可是你很少会间接利用meta-class,他们仍然坚持着奥秘的面纱。我们从在运转时创立一个类入手下手。经由过程检察“classpair”,我会注释meta-class是甚么,同时也漫谈谈在Objective-C中的对象大概类相干的一些一样平常主题。
在运转时创立一个类

上面的代码在运转时创立了一个NSError的子类同时为它增加了一个办法:
  1. ClassnewClass=objc_allocateClassPair([NSErrorclass],"RuntimeErrorSubclass",0);class_addMethod(newClass,@selector(report),(IMP)ReportFunction,"v@:");objc_registerClassPair(newClass);
复制代码
增加的办法利用叫ReportFunction的函数作为完成,界说以下:
  1. voidReportFunction(idself,SEL_cmd){NSLog(@"Thisobjectis%p.",self);NSLog(@"Classis%@,andsuperis%@.",[selfclass],[selfsuperclass]);ClasscurrentClass=[selfclass];for(inti=1;i<5;i++){NSLog(@"Followingtheisapointer%dtimesgives%p",i,currentClass);currentClass=object_getClass(currentClass);}NSLog(@"NSObjectsclassis%p",[NSObjectclass]);NSLog(@"NSObjectsmetaclassis%p",object_getClass([NSObjectclass]));}
复制代码
外表下去看,十分复杂。在运转时创立一个类只必要这三步:
1、为“classpair”创立存储空间(利用objc_allocateClassPair)。
2、为这个类增加所需的methods和ivars(我已利用class_addMethod增加过一个办法了)。
3、注册这个类,然后就能够利用了(利用objc_registerClassPair)。
然后,中级成绩是:“classpair”是甚么?函数objc_allocateClassPair只前往了一个值:这个class。这一对中的另外一个在哪?(译注:pair有“一对,一双”的意义)
我敢一定你已猜到了另外一半就是meta-class(就是这篇文章的题目),可是要注释那是甚么和你为何必要它,我必要先容一些在Objective-C中的关于对象和类的背景常识。
把一个数据布局变成对象必要甚么?

每一个对象都有一个类。这是面绝对象观点的基本常识,但在Objective-C中不是如许,它(译注:class)一样是这个数据的一部分。每一个能够被当做对象的数据布局都在得当的地位有一个指向一个类的指针。
在Objective-C,一个对象的类由它的isa指针决意。isa指针指向这个对象的Class。
现实上,在Objective-C中的对象的界说看起来像如许:
  1. typedefstructobjc_object{Classisa;}*id;
复制代码
这就是说:任何布局体只需以一个指向Class布局的指针入手下手的就能够被当做是objc_object。
在Objective-C中的对象的一个主要的特征是,你能够向它们发送动静:
  1. [@"stringValue"writeToFile:@"/file.txt"atomically:YESencoding:NSUTF8StringEncodingerror:NULL];
复制代码
你能够这么做是由于,当你向一个Objective-C的对象(像这里的NSCFString)发送动静的时分,runtime沿着对象的isa指针找到了这个对象的Class(这里是NSCFString的类)布局体。Class布局体中包括了一个这个类的办法列表和一个指向父类的指针,用于查找承继的办法。
关头点是Class布局体中界说了你能够向一个对象发送的动静。
meta-class是甚么?

如今,你大概已晓得,在Objective-C中一个Class也是一个对象。这就意味着你也能够向一个Class发送动静。
  1. NSStringEncodingdefaultStringEncoding=[NSStringdefaultStringEncoding];
复制代码
这里,向NSString类发送了defaultStringEncoding。
能够这么做是由于在Objective-C中每一个Class它本人一样也是个对象。也就是说Class布局体必需以isa指针入手下手,然后就能够在二进制兼容(binarycompatible)我下面先容的objc_object布局了,接着下一个字段必需是一个指向它的父类的指针(如果类就是基类就是nil)。
我上周已先容过,界说一个类有好几种办法,次要依附于你正在运转的runtime的版本。但,是的,都是由一个isa字段入手下手然后是superclass字段。
  1. typedefstructobjc_class*Class;structobjc_class{Classisa;Classsuper_class;/*以下依附于runtime的详细完成……*/};
复制代码
但是,为了让我们在Class上挪用一个办法,Class的isa指针必需指向一个Class布局体,而且谁人Class布局体必需包括我们能够在谁人Class上挪用的办法的列表。
这就引出了meta-class的界说:meta-class是Class对象的类(themeta-classistheclassforaClassobject)。
复杂来讲:


  • 当你向一个对象发送动静,就在谁人对象的办法列表中查找谁人动静。
  • 当你想一个类发送动静,就再谁人类的meta-class中查找谁人动静。
meta-class是必需的,由于它为一个Class存储类办法。每一个类都必需有一个独一的meta-class,由于每一个Class都有一个大概纷歧样的类办法。
meta-class的类是甚么?

meta-class,如之前的Class,一样是个对象。这就意味着你也能够在它下面挪用办法。天然的,这就意味着它也必需有一个类(译注:isa指针)。
一切的meta-class利用它们基类的meta-class(承继条理中最顶层的Class的meta-class)作为它们本人的类。这就是说一切承继自NSObject的类(年夜部分的类),以NSObject的meta-class作为本人的meta-class的类。
遵守这个划定规矩,一切的meta-class利用基类的meta-class作为他们的类,任何基类的meta-class将会是他们本人(它们的isa指向他们本人)。这就是说NSObject的meta-class的isa指针指向它们本人(是本人的一个实例)。
class和meta-class的承继

和Class以super_class指针指向它的父类的办法一样,meta-class以super_class指针指向Class的super_class的meta-class。(译注:这句话有点绕,就是super-class一个指向Class的父类,一个指向meta-class的父类。Class是一样平常对象的范例,meta-class是Class的范例。)
进一步来说,基类的meta-class设置super_class指针指向基类本人。
这个承继条理的了局就是,一切在这个承继条理中的的实例,类和meta-class都承继了基类的条理。
关于一切在NSObject条理中的实例,类和meta-class,这就意味着一切NSObject的实例办法都是无效的。关于类和meta-class,一切NSObject的类办法也一样是无效的。
一切这些在字面上相称让人狐疑。GregParker已把实例,类,meta-class另有他们的超类以十分棒的图解的体例聚合在一同,展现他们是怎样在一同事情的。
用实行考证这点

为了考证这些,让我们看看在我文章开首供应的ReportFunction的输入。这个函数的目标是顺着isa指针打引出它找到的。
要运转ReportFunction,我们必要为这个静态创立的类创立一个实例,然后在下面挪用这个办法。
  1. idinstanceOfNewClass=[[newClassalloc]initWithDomain:@"someDomain"code:0userInfo:nil];[instanceOfNewClassperformSelector:@selector(report)];[instanceOfNewClassrelease];
复制代码
由于没有这个办法的声明,以是我利用performSelector:挪用这个办法,如许编译器就不会输入告诫了。
如今ReportFunction会沿着isa指针告知我们这个对象利用了哪些类,meta-class和meta-class的类。
猎取一个对象的类:ReportFunction利用object_getClass跟从isa指针,由于isa指针是一个类中一个受回护的成员变量(你不克不及间接会见其他对象的isa指针)。ReportFunction没有以类办法的情势如许挪用,由于在Class对象上挪用类办法不会前往meta-class,而是再次前往Class对象(以是[NSStringclass]会前往NSString的类而不是NSString的meta-class)。
这个是程序运转后的了局(省往了NSLog的前缀)。
  1. Thisobjectis0x10010c810.ClassisRuntimeErrorSubclass,andsuperisNSError.Followingtheisapointer1timesgives0x10010c600Followingtheisapointer2timesgives0x10010c630Followingtheisapointer3timesgives0x7fff71038480Followingtheisapointer4timesgives0x7fff71038480NSObjectsclassis0x7fff710384a8NSObjectsmetaclassis0x7fff71038480
复制代码
看看经由过程递回的检察isa的地点:


  • theobjectisaddress0x10010c810.
  • theclassisaddress0x10010c600.
  • themeta-classisaddress0x10010c630.
  • themeta-class’sclass(i.e.theNSObjectmeta-class)isaddress0x7fff71038480.
  • theNSObjectmeta-class’classisitself.
地点的值不是很主要,只是演示了下面会商的从类到meta-class到NSObject的meta-class的历程。

NSStringNSArrayNSDictionary等这些工具在所有的框架里都会出现iOS大部分类都是继承自NSObject(我还没见过不是继承自NSObject的..)
活着的死人 该用户已被删除
沙发
发表于 2015-1-21 11:19:14 | 只看该作者
iPhone文件系统NSFileManager讲解是本文要介绍的内容,主要是通过iphone文件系统来学习NSFileManager的使用方法,具体内容来看本文详解。
板凳
发表于 2015-1-30 17:01:03 | 只看该作者
近期由于IOS7的发布,所以应用的适配潮可谓是都搞的锣鼓喧天,甚是热闹,因此呢,因适配IOS7而产生的问题也是铺天盖地的卷来,
再现理想 该用户已被删除
地板
发表于 2015-2-4 22:37:17 | 只看该作者
看完这个你就可以有多种选择来踏入做应用的阶段
谁可相欹 该用户已被删除
5#
发表于 2015-2-6 17:39:21 | 只看该作者
down下code4app网站的每个分类的代码挨着看
莫相离 该用户已被删除
6#
发表于 2015-2-7 09:09:28 | 只看该作者
自从苹果公司开放iOS SDK以来,大量的国内外的软件开发者将关注的目光聚集在苹果的iOS平台上。由于iPhone和iPad自一出现就给人带来了颠覆性的感觉
小妖女 该用户已被删除
7#
发表于 2015-2-7 20:15:13 | 只看该作者
从C语言入门,因为IOS开发用的是OC语言,是在C基础上的,不过也跟C不是很搭界,你可以直接学习OC语言也可以,
灵魂腐蚀 该用户已被删除
8#
发表于 2015-2-9 23:28:57 | 只看该作者
中国如今已然发展成为一个软件大国,软件人才的数量跃居全球之首。当然,在苹果平台的开发领域,也保持了相当强劲的发展势头。然而,很多初入iOS开发门槛的开发者,
兰色精灵 该用户已被删除
9#
发表于 2015-2-28 05:18:11 | 只看该作者
iPhone文件系统:创建、重命名以及删除文件,NSFileManager中包含了用来查询单词库目录、创建、重命名、删除目录以及获取/设置文件属性的方法(可读性,可编写性等等)。
山那边是海 该用户已被删除
10#
发表于 2015-3-4 10:53:46 | 只看该作者
最后在做项目的时候一定要认真对待,毕竟这个直接和你的就业挂钩,这也是锻炼你实际操作的能力。
海妖 该用户已被删除
11#
发表于 2015-3-9 14:48:23 | 只看该作者
看完这个你就可以有多种选择来踏入做应用的阶段
不帅 该用户已被删除
12#
发表于 2015-3-11 11:52:51 | 只看该作者
以上可以同时进行,学习过程中尽量不要纠结细节和底层,要知道ios是封闭的、OC是高级语言,我们不可能过多地去了解它的原理,至少在新手阶段没有必要。用迭代的方式更新你的知识,而不是死抠一个知识点。
若相依 该用户已被删除
13#
发表于 2015-3-14 16:15:55 | 只看该作者
每个行业都一样,想要一天学有所成是不可能的,一定要做好努力的准备,做ios不是简单的学会oc语言。不怕多走弯路,就怕不肯动手。
再见西城 该用户已被删除
14#
发表于 2015-3-17 01:07:56 | 只看该作者
自从苹果公司开放iOS SDK以来,大量的国内外的软件开发者将关注的目光聚集在苹果的iOS平台上。由于iPhone和iPad自一出现就给人带来了颠覆性的感觉
只想知道 该用户已被删除
15#
发表于 2015-3-17 23:31:48 | 只看该作者
首先是基础,在汉昌的课程非常全面。从object—c到最后的毕业项目,基本上方方面面都涉及到了,我是一名非计算机专业的学生,起初学习还有点吃力,因为基础知识薄弱。经常像听天书
飘飘悠悠 该用户已被删除
16#
 楼主| 发表于 2015-3-25 07:28:59 | 只看该作者
然而,在vmware软件环境下,安装Mac OS X操作系统也是一件非常复杂的事情,而且还有可能花费了大量时间,最后却跑不起来。笔者也是经过了大量的实践,
admin 该用户已被删除
17#
发表于 2015-4-16 01:08:35 | 只看该作者
还有开发工具是用Xcode,是在Mac系统的,你多摸索一下就可以开发简单的应用了,建议你买一本iphone开发秘籍第二版看看,希望可以帮到你,谢谢。
愤怒的大鸟 该用户已被删除
18#
发表于 2015-4-26 13:12:46 | 只看该作者
我也从简单的状态栏适配开始,先研究了下关于状态栏的适配,特总结如下,供广大网友一起讨论交流。
因胸联盟 该用户已被删除
19#
发表于 2015-5-2 14:19:16 | 只看该作者
AD: iPhone文件系统NSFileManager讲解是本文要介绍的内容,主要是通过iphone文件系统来学习NSFileManager的使用方法,具体内容来看本文详解。
乐观 该用户已被删除
20#
发表于 2015-5-4 19:48:14 | 只看该作者
每个行业都一样,想要一天学有所成是不可能的,一定要做好努力的准备,做ios不是简单的学会oc语言。不怕多走弯路,就怕不肯动手。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 19:08

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表