仓酷云

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

[学习教程] IOS设计Objective-C――动静、Category和Protocol 仓酷云

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

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

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

x
我当时刚学iOS开发的时候一样的感觉总想知道原理内部怎么回事感觉在像在雾里但是iOS开发就是这样他是封闭的本身就是在雾里...面向对象永久是个能够吐槽的话题,从入手下手提出到推许备至,到充斥质疑,一起走来让人欷歔不已。面向对象的头脑可谓汗青久长,20世纪70年月的Smalltalk能够说是面向对象言语的典范,直到明天我们仍然将这门言语视为面向对象言语的基本。
面向对象是年夜部分编程言语的基础特征,像C++、Java、Objective-C如许的静态言语,Ruby、Python如许的静态言语都是面向对象的言语。可是怎样编写面向对象的程序却一向是困扰人们的话题,即便是Smalltalk,也有人以为这是一个出缺陷的面向对象的言语完成。
我在2010年翻译过的一篇InfoQ的文章,《面向对象编程──走错了路》中提到,面向对象编程的三个准绳是:基于动静传送机制,对象分别和多态。文章中还举了Erlang例子,以为Erlang具有了这些准绳,“以是多是独一的面向对象言语”。除之条件到的三个特性,单承继和静态范例也被援用为面向对象言语的“相对需求”。基于这些思索,文章指出,Smalltalk在完成对象头脑时的“毛病”──比方,只存眷形态和举动,在类和基于映像的言语里缺少优秀的并发模子和动静机制。
这篇文章中的中心就是,面向对象头脑中除对象的形态、举动,还应当存眷其并发机制、动静机制,后者更加主要。这一点现实上是我在打仗了Objective-C以后才有了更深切的体味。
Ojbective-C的语法计划次要基于Smalltalk,除供应传统的面向对象编程特征以外,还增添了良多相似静态言语Ruby、Python才具有的特征,比方静态范例、静态加载、静态绑定等等,同时强化了动静传送机制和表意(IntentionRevealingInterface)接口的观点。
动静

动静传送模子(MessagePassing)是Objective-C言语的中心机制。在Objective-C中,没无方法挪用这类说法,只要动静传送。在C++或Java中挪用某个类的办法,在Objective-C中是给该类发送一个动静。在C++或Java里,类与类的举动办法之间的干系十分严密,一个办法一定属于一个类,且于编译时就已绑定在一同,以是你不成能挪用一个类里没有的办法。而在Objective-C中就对照复杂了,类和动静之间是松耦合的,办法挪用只是向某个类发送一个动静,该类能够在运转时再断定怎样处置承受到的动静。也就是说,一个类不包管必定会呼应吸收到的动静,假如收到了一个没法处置的动静,那末程序既不会堕落也不或宕失落,它仅仅是甚么都不做,并前往一个nil。这类计划自己也对照切合软件的隐喻。
在表意接口(IntentionRevealingInterface)方面,Objective-C也是计划的对照杰出的言语。面向对象言语的特征之一就是经由过程API把完成封装起来,为下层修建供应服务。可是必要注重的一点就是,你封装的API最好可以让挪用者看到接口形貌就晓得怎样利用。假如为了利用一个API必需要往研讨它的完成,那末就得到了封装的意义。Objective-C经由过程显式的API形貌,闪开发者不盲目的写出满意表意接口的API,好比下图中的API形貌。

<br>
:传统实例办法
上图中形貌了一个传统意义的实例办法,但和Java或C++分歧的是,其办法关头字由多个字符串构成,在这个例子是insertObject和atIndex,(id)anObject和(NSUInterger)index分离暗示参数范例和参数称号。全部办法看上往就像一个英语句子,我们能够很简单的晓得,这个办法就是在索引为index处拔出一个对象。假如你是从其他言语转到Objective-C,那末入手下手的时分会感到这类写法有些繁复,可是一旦了解并习气了你会感觉到其伟大的优点,这类写法会强迫你写出幽美易读的代码和API,并且有了XCode壮大的提醒功效,再长的办法也是一挥而就。
上面我们来讲说多态和承继。与Java一样,Objective-C一样不撑持多重承继,可是经由过程种别(Category)和协定(Protocol)能够很好的完成代码复用和扩大。
Category

起首我们来谈谈Category。
Objective-C供应了一种不同凡响的体例——Catagory,能够静态的为已存在的类增加新的举动。如许能够包管类的原始计划范围较小,功效增添时再慢慢扩大。利用Category对类举行扩大时,不必要会见其源代码,也不必要创立子类。Category利用复杂的体例,完成了类的相干办法的模块化,把分歧的类办法分派到分歧的分类文件中。
完成起来很复杂,我们举例申明。
  1. SomeClass.h@interfaceSomeClass:NSObject{}-(void)print;@end
复制代码
这是类SomeClass的声明文件,个中包括一个实例办法print。假如我们想在不修正原始类、不增添子类的情形下,为该类增添一个hello的办法,只必要复杂的界说两个文件SomeClass+Hello.h和SomeClass+Hello.m,在声明文件和完成文件顶用“()”把Category的称号括起来便可。声明文件代码以下:
  1. #import"SomeClass.h"@interfaceSomeClass(Hello)-(void)hello;@end
复制代码
完成文件代码以下
  1. #import"SomeClass+Hello.h"@implementationSomeClass(Hello)-(void)hello{NSLog(@"name:%@",@"Jacky");}@end
复制代码
个中Hello是Category的称号,假如你用XCode创立Category,那末必要填写的内容包含称号和要扩大的类的称号。这里另有一个商定成俗的习气,将声明文件和完成文件称号一致接纳“原类名+Category”的体例定名。
挪用也十分复杂,毫无压力,以下:起首引进Category的声明文件,然后一般挪用便可。
  1. #import"SomeClass+Hello.h"SomeClass*sc=[[SomeClassalloc]init];[schello]
复制代码
实行了局是:
  1. name:Jacky
复制代码
Category的利用场景:

  • 当你在界说类的时分,在某些情形下(比方需求变动),你大概想要为个中的某个或几个类中增加办法。
  • 一个类中包括了很多分歧的办法必要完成,而这些办法必要分歧团队的成员完成
  • 当你在利用基本类库中的类时,你大概但愿这些类完成一些你必要的办法。
碰到以上这些需求,Category能够匡助你办理成绩。固然,利用Category也有些成绩必要注重,

  • Category能够会见原始类的实例变量,但不克不及增加变量,假如想增加变量,能够思索经由过程承继创立子类。
  • Category能够重载原始类的办法,但不保举这么做,这么做的成果是你不再能会见本来的办法。假如的确要重载,准确的选择是创立子类。
  • 和一般接口有所区分的是,在分类的完成文件中能够不用完成一切声明的办法,只需你不往挪用它。
用好Category能够充实使用Objective-C的静态特征,编写出天真简便的代码。
Protocol

上面我们再来看Protocol。
Protocol,复杂来讲就是一系列不属于任何类的办法列表,个中声明的办法能够被任何类完成。这类形式一样平常称为代办署理(delegation)形式。你经由过程Protocol界说各类举动,在分歧的场景接纳分歧的完成体例。在iOS和OSX开辟中,Apple接纳了大批的代办署理形式来完成MVC中View和Controller的解耦。
界说Protocol很复杂,在声明文件(h文件)中经由过程关头字@protocol界说,然后给出Protocol的称号,办法列表,然后用@end暗示Protocol停止。在@end指令停止之前界说的办法,都属于这个Protocol。比方:
  1. @protocolProcessDataDelegate<NSObject>@required-(void)processSuccessful:(BOOL)success;@optional-(id)submitOrder:(NSNumber*)orderid;@end
复制代码
以上代码能够独自放在一个h文件中,也能够写在相干类的h文件中,能够视详细情形而定。该Protocol包括两个办法,processSuccessful和submitOrder。这里另有两个关头字,@required和@optional,暗示假如要完成这个协定,那末processSuccessful办法是必需要完成的,submitOrder则是可选的,这两个注解关头字是在Objective-C2.0以后到场的语法特征。假如不说明,那末办法默许是@required的,必需完成。
那末怎样完成这个Protocol呢,很复杂,创立一个一般的Objective-C类,取名为TestAppDelegate,这时候会天生一个h文件和m文件。在h文件中引进包括Protocol的h文件,以后声明接纳这个Protocol便可,以下:
  1. @interfaceTestAppDelegate:NSObject<ProcessDataDelegate>;@end
复制代码
用尖括号(<…>)括起来的ProcessDataDelegate就是我们创立的Protocol。假如要接纳多个Protocol,能够在尖括号内引进多个Protocol称号,并用逗号离隔便可。比方<ProcessDataDelegate,xxxDelegate>
m文件以下:
  1. @implementationTestAppDelegate-(void)processSuccessful:(BOOL)success{if(success){NSLog(@"乐成");}else{NSLog(@"失利");}}@end
复制代码
因为submitOrder办法是可选的,以是我们能够只完成processSuccessful。
Protocol一样平常利用在哪些场景呢?Objective-C里的Protocol和Java言语中的接口很相似,假如一些类之间没有承继干系,可是又具有某些不异的举动,则可使用Protocol来形貌它们的干系。分歧的类,能够恪守统一个Protocol,在分歧的场景下注进分歧的实例,完成分歧的功效。个中最经常使用的就是托付代办署理形式,Cocoa框架中大批接纳了这类形式完成数据和UI的分别。比方UIView发生的一切事务,都是经由过程托付的体例交给Controller完成。依据商定,框架中后缀为Delegate的都是Protocol,比方UIApplicationDelegate,UIWebViewDelegate等,利用时人人能够寄望一下,体味其用法。
利用Protocol时还必要注重的是:
1、Protocol自己是能够承继的,好比:
  1. @protocolA-(void)methodA;@end@protocolB<A>-(void)methodB;@end
复制代码
假如你要完成B,那末methodA和methodB都必要完成。
2、Protocol是类有关的,任何类都能够完成界说好的Protocol。假如我们想晓得某个类是不是完成了某个Protocol,还可使用conformsToProtocol举行判别,以下:
  1. [objconformsToProtocol:@protocol(ProcessDataDelegate)]
复制代码
好吧,详细的言语特征此次就先容这么多。从某种意义下去说,Objective-C是一门陈旧的言语,创造于1980年。1988年,乔布斯的Next公司取得了Objective-C言语的受权,并开辟出了Objective-C的言语库和NEXTSTEP的开辟情况。NextStep是以Mach和BSD为基本,Objective-C是其言语和运转库,厥后的事人人都分明,苹果买了Next,乔布斯回回苹果,入手下手奇妙的苹果复兴之路,NextStep成了MaxOSX的基本。今后开展愈来愈好,Objctive-C成了Apple确当家言语,如今基础上是Apple在保护Objctive-C的开展。
在苹果的AppStore推出之前,Objective-C一向绝对小众,可是其优异的言语特征仿佛一向在为前面的发作积储力气,当苹果平台级的使用呈现以后,Objective-C入手下手年夜放异彩,静态言语的效力和静态言语的特征失掉浩瀚程序员的喜好,今朝它已以火箭般的速率蹿升TIOBE言语排行版第四位。
关于喜好苹果手艺的手艺职员来讲,Objective-C是你必需深切懂得和值得进修的一门言语,但愿今后无机会多写一些相干的文章。
原文链接:Objective-C——动静、Category和Protocol

一个人负责协调他们的工作并且如果有新增加的衣服或者要移除之前的衣服通知他俩(NSManagedObjectContext)NSManagedObject
因胸联盟 该用户已被删除
沙发
发表于 2015-1-21 13:11:38 | 只看该作者
iPhone文件系统:创建、重命名以及删除文件,NSFileManager中包含了用来查询单词库目录、创建、重命名、删除目录以及获取/设置文件属性的方法(可读性,可编写性等等)。
第二个灵魂 该用户已被删除
板凳
发表于 2015-1-30 13:00:28 | 只看该作者
特别是在校的学生,都存在一个小小的尴尬——虽然学习iOS开发的热情高涨,但由于没有多余的银子购买昂贵的Mac电脑而踟蹰不前。其实,针对初学者,如果想进入iOS开发的天地
柔情似水 该用户已被删除
地板
发表于 2015-2-2 13:07:13 | 只看该作者
自从苹果公司开放iOS SDK以来,大量的国内外的软件开发者将关注的目光聚集在苹果的iOS平台上。由于iPhone和iPad自一出现就给人带来了颠覆性的感觉
小妖女 该用户已被删除
5#
发表于 2015-2-6 13:52:03 | 只看该作者
要学会通过各种方法将面前的事情变成自己感兴趣的,那专研起来就不会是无聊和折磨了。
深爱那片海 该用户已被删除
6#
发表于 2015-3-3 12:49:14 | 只看该作者
从C语言入门,因为IOS开发用的是OC语言,是在C基础上的,不过也跟C不是很搭界,你可以直接学习OC语言也可以,
若相依 该用户已被删除
7#
发表于 2015-3-5 23:18:47 | 只看该作者
因为我们老师也是自学的,给我们讲课说的最多的就是百度,谷歌,查文档。
海妖 该用户已被删除
8#
 楼主| 发表于 2015-3-11 19:42:25 | 只看该作者
培训的时候很痛苦,每天要待12个小时,上午讲课,下午和晚自习解决作业,看文档,学习的时候感觉就是资料太少,而且看着资料也不明所以,非常痛苦,
老尸 该用户已被删除
9#
发表于 2015-3-16 02:13:37 | 只看该作者
培训时可以选择安卓,iOS,Java,因为实习的时候我选了安卓,当时实习时间只有三周,学的晕头转向,而java我也没学过,iOS的基础是C语言,这个大学里还是学过的,于是选择了iOS。
分手快乐 该用户已被删除
10#
发表于 2015-3-18 17:26:38 | 只看该作者
重要的是,放眼全球也的确找不到第二个如苹果iOS平台这样健壮、完整、先进而且为开发者带来真实收益的开发平台来。
莫相离 该用户已被删除
11#
发表于 2015-3-18 20:52:51 | 只看该作者
在此,某不才愿将安装成功的Mac OS X系统的vmware虚拟机向有志学习iOS开发的各位学友们免费开放出来,经测试,可以在WindowsXP/Win7系统上完美运行,即便你的机器只有2GB内存。
小魔女 该用户已被删除
12#
发表于 2015-3-21 13:09:19 | 只看该作者
到大三时,学院与我去培训的机构成立了实习基地,并让我们寒假去实习了一段时间,感觉还不错,于是在大四的时候去培训了
透明 该用户已被删除
13#
发表于 2015-3-28 04:03:17 | 只看该作者
自从苹果公司开放iOS SDK以来,大量的国内外的软件开发者将关注的目光聚集在苹果的iOS平台上。由于iPhone和iPad自一出现就给人带来了颠覆性的感觉
飘飘悠悠 该用户已被删除
14#
发表于 2015-3-29 22:34:27 | 只看该作者
其次学习方法和学习心态很重要,在学习当中应该保持一颗良好的心态。应该借鉴别人好的学习方法,大家互相帮助,取长补短。
再现理想 该用户已被删除
15#
发表于 2015-4-6 11:02:27 | 只看该作者
down下code4app网站的每个分类的代码挨着看
冷月葬花魂 该用户已被删除
16#
发表于 2015-4-25 17:49:13 | 只看该作者
培训的时候很痛苦,每天要待12个小时,上午讲课,下午和晚自习解决作业,看文档,学习的时候感觉就是资料太少,而且看着资料也不明所以,非常痛苦,
精灵巫婆 该用户已被删除
17#
发表于 2015-4-28 23:57:07 | 只看该作者
因为我们老师也是自学的,给我们讲课说的最多的就是百度,谷歌,查文档。
小女巫 该用户已被删除
18#
发表于 2015-5-4 20:59:33 | 只看该作者
才在自己的Windows电脑上安装配置成功了一个完美的Mac OS X Lion(10.7.4)系统,而且下载了Xcode4.5的最新版本。虽然不能实机调试,但是作为iOS开发学习已经非常完美了。
爱飞 该用户已被删除
19#
发表于 2015-5-7 03:48:55 | 只看该作者
我也从简单的状态栏适配开始,先研究了下关于状态栏的适配,特总结如下,供广大网友一起讨论交流。
谁可相欹 该用户已被删除
20#
发表于 2015-5-12 14:58:29 | 只看该作者
学习ios没什么捷径,关键在于多动手敲,曾看到前辈开玩笑说怎么快速学会某技术,答案是:“提高打字速度,快点写代码就能快点学会了”。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-5-2 14:44

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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