精灵巫婆 发表于 2015-1-18 11:37:05

IOS教程之Objective-C 的“多承继”仓酷云

对应sql里的tableNSPredicate谓语类似select语句中的条件上面这三个类就可以用来请求数据了当单承继不敷用,很难为成绩域建模时,我们一般城市间接想到多承继。多承继是从过剩一个间接基类派生类的才能,能够加倍间接地为使用程序建模。可是Objective-C不撑持多承继,因为动静机制名字查找产生在运转时而非编译时,很难明决多个基类大概招致的二义性成绩。不外实在Objective-C也无需撑持多承继,我们能够找到以下几种直接完成多承继目标的办法:


[*]动静转发
[*]delegate和protocol
[*]种别
动静转发


当向someObject发送某动静,但runtimesystem在以后类和父类中都找不到对应办法的完成时,runtimesystem其实不会当即报错使程序溃散,而是顺次实行以下步骤:

<br>
分离简述一下游程:
1.静态办法剖析
向以后类发送resolveInstanceMethod:旌旗灯号,反省是不是静态向该类增加了办法。(渺茫请搜刮:@dynamic)
2.疾速动静转发
反省该类是不是完成了forwardingTargetForSelector:办法,若完成了则挪用这个办法。若该办法前往值对象非nil或非self,则向该前往对象从头发送动静。
3.尺度动静转发
runtime发送methodSignatureForSelector:动静猎取Selector对应的办法署名。前往值非空则经由过程forwardInvocation:转发动静,前往值为空则向以后对象发送doesNotRecognizeSelector:动静,程序溃散加入。

望文生义,我们能够使用上述过程当中的2、3两种体例来完成动静转发。
疾速动静转发

疾速动静转发的完成办法很复杂,只必要重写-(id)forwardingTargetForSelector:(SEL)aSelector办法便可。
我来举个复杂的例子,好比现有2个类:Teacher和Doctor,Doctor能够做手术(operate办法)。

[*]@interfaceTeacher:NSObject
[*]
[*]@end

[*]@interfaceDoctor:NSObject
[*]
[*]-(void)operate;
[*]@end
经由过程疾速动静转发,能够很轻松的让teacher挪用doctor的办法做手术。

Teacher类必要完成将动静转发给Doctor:

[*]-(id)forwardingTargetForSelector:(SEL)aSelector
[*]{
[*]Doctor*doctor=[init];
[*]if(){
[*]returndoctor;
[*]}
[*]returnnil;
[*]}
固然动静能够静态转发传送,可是编纂器的静态反省是绕不外的,那末成绩来了,既然Teacher类没有完成operate办法又该怎样声明呢?
到今朝为止,我只想到上面2种办法:
声明办法1————种别




[*]@interfaceTeacher(DoctorMethod)
[*]-(void)operate;
[*]
[*]@end
声明办法2————导进头文件、挪用时强转范例

Teacher类头文件必要包括Doctor头文件,告知编译器往Doctor.h中能够找到operator办法的声明,而且在挪用时强转范例。

[*]Teacher*teacher=[init];
[*][(Doctor*)teacheroperate];
有乐趣能够思索一个成绩:假如将其范例转成id,也能够编译经由过程,并完成转发。但是会带来甚么隐患呢?

办法1利用种别充足明晰烦琐,为何还要提出举措2呢?我的设法是,办法1的坏处是抛出来的办法是定逝世的,并且在.h里露着;办法2就绝对天真,并且埋没了我要转发的动静。
尺度动静转发


尺度动静转发必要重写methodSignatureForSelector:和forwardInvocation:两个办法便可。
发流程如图所示:

<br>
转发重写办法:

[*]-(NSMethodSignature*)methodSignatureForSelector:(SEL)aSelector
[*]{
[*]NSMethodSignature*signature=;
[*]if(signature==nil){
[*]signature=;
[*]}
[*]NSUIntegerargCount=;
[*]for(NSIntegeri=0;i<argCount;i++){
[*]}
[*]
[*]returnsignature;
[*]}
[*]
[*]-(void)forwardInvocation:(NSInvocation*)anInvocation
[*]{
[*]SELseletor=;
[*]if(){
[*];
[*]}
[*]
[*]}
两种动静转发体例的对照

疾速动静转发:复杂、疾速、但仅能转发给一个对象。
尺度动静转发:稍庞大、较慢、但转发操纵完成可控,能够完成多对象转发。


delegate和protocol

托付是Objective-C中最经常使用的一种回调机制。用法我以为没甚么好说的,总结一下该机制特性:


[*]托付帮忙主体完成操纵义务,将必要定制化的操纵预留给托付对象来自界说完成,相似子类化主体。
[*]除此以外,能够用作事务监听。
[*]一时还真想不出来了…


当时要是有人告诉我这些估计少走不少弯路还有提醒各位初学者刚开始学的时候会有几个月的低谷期很容易放弃如果挺过最开始的几个月后来就越学越容易了

莫相离 发表于 2015-1-19 09:13:46

看《iPhone 4与iPad开发基础教程》,跟着一步步来

愤怒的大鸟 发表于 2015-1-24 11:40:26

然而,在vmware软件环境下,安装Mac OS X操作系统也是一件非常复杂的事情,而且还有可能花费了大量时间,最后却跑不起来。笔者也是经过了大量的实践,

谁可相欹 发表于 2015-1-27 23:48:08

每个行业都一样,想要一天学有所成是不可能的,一定要做好努力的准备,做ios不是简单的学会oc语言。不怕多走弯路,就怕不肯动手。

admin 发表于 2015-2-2 19:37:02

特别是在校的学生,都存在一个小小的尴尬——虽然学习iOS开发的热情高涨,但由于没有多余的银子购买昂贵的Mac电脑而踟蹰不前。其实,针对初学者,如果想进入iOS开发的天地

深爱那片海 发表于 2015-2-8 04:36:14

培训时可以选择安卓,iOS,Java,因为实习的时候我选了安卓,当时实习时间只有三周,学的晕头转向,而java我也没学过,iOS的基础是C语言,这个大学里还是学过的,于是选择了iOS。

活着的死人 发表于 2015-2-8 05:43:04

然而,在vmware软件环境下,安装Mac OS X操作系统也是一件非常复杂的事情,而且还有可能花费了大量时间,最后却跑不起来。笔者也是经过了大量的实践,

第二个灵魂 发表于 2015-2-15 05:29:38

iPhone文件系统NSFileManager讲解是本文要介绍的内容,主要是通过iphone文件系统来学习NSFileManager的使用方法,具体内容来看本文详解。

海妖 发表于 2015-2-26 18:19:41

特别是在校的学生,都存在一个小小的尴尬——虽然学习iOS开发的热情高涨,但由于没有多余的银子购买昂贵的Mac电脑而踟蹰不前。其实,针对初学者,如果想进入iOS开发的天地

乐观 发表于 2015-3-4 16:34:42

其次学习方法和学习心态很重要,在学习当中应该保持一颗良好的心态。应该借鉴别人好的学习方法,大家互相帮助,取长补短。

再见西城 发表于 2015-3-8 15:30:52

因为我们老师也是自学的,给我们讲课说的最多的就是百度,谷歌,查文档。

灵魂腐蚀 发表于 2015-3-11 12:56:12

到大三时,学院与我去培训的机构成立了实习基地,并让我们寒假去实习了一段时间,感觉还不错,于是在大四的时候去培训了

飘灵儿 发表于 2015-3-17 07:10:15

看《iPhone 4与iPad开发基础教程》,跟着一步步来

飘飘悠悠 发表于 2015-3-22 18:08:18

有办法利用自己手头的电脑立刻开始这个美妙旅程的。

精灵巫婆 发表于 2015-3-22 22:13:43

有办法利用自己手头的电脑立刻开始这个美妙旅程的。

变相怪杰 发表于 2015-3-23 23:03:25

以上可以同时进行,学习过程中尽量不要纠结细节和底层,要知道ios是封闭的、OC是高级语言,我们不可能过多地去了解它的原理,至少在新手阶段没有必要。用迭代的方式更新你的知识,而不是死抠一个知识点。

小妖女 发表于 2015-3-28 03:43:33

好处就是运行速度会变快,ios6针对系统的优化进一步加强了,很多网友测试ios6,第一感觉就是速度快,而且ios69会有一些新功能,新浪微博,facetime支持3G网等等。。弊端就是,现在的ios6只能算是正式版本的第一个版本,bug很多,不少人刷完ios6都出现了很多毛病,开不开机,缺少图标等等。。最好现在不要升级,等官网放出下一个版本的时候,再选择升级。。。

小女巫 发表于 2015-4-6 13:02:00

然而,在vmware软件环境下,安装Mac OS X操作系统也是一件非常复杂的事情,而且还有可能花费了大量时间,最后却跑不起来。笔者也是经过了大量的实践,

老尸 发表于 2015-4-9 10:02:27

iPhone文件系统:创建、重命名以及删除文件,NSFileManager中包含了用来查询单词库目录、创建、重命名、删除目录以及获取/设置文件属性的方法(可读性,可编写性等等)。

冷月葬花魂 发表于 2015-6-27 16:57:20

学习ios没什么捷径,关键在于多动手敲,曾看到前辈开玩笑说怎么快速学会某技术,答案是:“提高打字速度,快点写代码就能快点学会了”。
页: [1] 2
查看完整版本: IOS教程之Objective-C 的“多承继”仓酷云