仓酷云

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

[学习教程] IOS设计iOS系列译文:值对象仓酷云

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

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

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

x
打开.xib的文件打开的就是IBIB和代码交互用的是IBActionIBOutlet这些标记这些标记追踪到他们的定义其实对编译器来说什么都不表示在这篇文章中,我们将看看怎样用Objective-C言语编写值对象。在编写时,我们将会打仗到Objective-C中的主要协定和办法。一个值对象是一个包括一些值的对象,而且能够举行相称对照。一般值对象能够被用作模子对象。比方,思索一个复杂的Person对象:
1
2
3
4
5
6
7
@interfacePerson:NSObject
@property(nonatomic,copy)NSString*name;
@property(nonatomic,strong)NSDate*birthDate;
@property(nonatomic)NSUIntegernumberOfKids;
@end

创立这些范例的对象是我们事情的面包和黄油(译者注:基础元素),固然这些对象看上往很复杂,可是仍旧包括很多奇妙的地方。
有一件事,我们良多人硬性的以为这些对象应当是刻舟求剑的。一旦你创立了一个Person对象,它不成能被改动。我们将在稍后触及到可变性这个成绩。
属性

起首要注重的是我们利用属性来界说一个Person的特性。创立属性是想当机器的:关于一般对象的属性,你设置它们为nonatomic和strong,而关于标量属性你只必要设置nonatomic。默许情形下,它们也是assign。有一个破例,关于具有可变正本的属性,你想将他们界说为copy。比方,name属性的范例是NSString,有大概呈现的情形是,有人创立了一个Person对象,并指定范例为NSMutableString的值。然后一段工夫后,他或她大概会改动这个可变的字符串。假如我们的属性是strong而不是copy,我们的Person对象会随之改动,这不是我们想要的。关于容器范例也是一样的,比方数组大概字典。
请注重,这个拷贝是浅拷贝,容器大概还包括可变对象。比方,假如你有一个NSMutableArray*a包括有NSMutableDictionary元素,则[acopy]将会给你一个不成变数组,可是元素是不异的NSMutableDictionary对象。正如我们稍后将看到的,不成变对象的拷贝是无本钱的,可是它增添了援用计数。
在旧的代码中,你大概看不到属性,由于他们是绝对近期才到场到Objective-C言语的。取代现有属性,有大概会看到自界说的getter和setter办法,或纯实例变量。关于如今的代码,仿佛仿佛年夜多半人都批准利用属性,这也是我们所保举的。
更多浏览:NSString:copyorretian

初始化办法

假如我们想要不成变对象,我们应当确保他们被创立后不克不及举行修正。我们能够经由过程增加一个初始化办法和在接口里使我们的属性只读来做到这一点。我们的接口将以下所示:
1
2
3
4
5
6
7
8
9
10
11
@interfacePerson:NSObject
@property(nonatomic,copy,readonly)NSString*name;
@property(nonatomic,strong,readonly)NSDate*birthDate;
@property(nonatomic,readonly)NSUIntegernumberOfKids;
-(instancetype)initWithName:(NSString*)name
birthDate:(NSDate*)birthDate
numberOfKids:(NSUInteger)numberOfKids;
@end

然后,在我们的完成中,我们必需使我们的属性readwrite,从而天生实例变量:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@interfacePerson()
@property(nonatomic,copy)NSString*name;
@property(nonatomic,strong)NSDate*birthDate;
@property(nonatomic)NSUIntegernumberOfKids;
@end
@implementationPerson
-(instancetype)initWithName:(NSString*)name
birthDate:(NSDate*)birthDate
numberOfKids:(NSUInteger)numberOfKids
{
self=[superinit];
if(self){
self.name=name;
self.birthDate=birthDate;
self.numberOfKids=numberOfKids;
}
returnself;
}
@end

如今我们能够机关新的Person对象,但不克不及修正它们了。这长短常有匡助的,当编写与Person对象事情的其他类时,我们晓得我们正在事情的值不克不及改动。
相称对照

要对照是不是相称,我们必需完成isEqual:办法。我们但愿isEqual:前往true当且仅当一切的属性都相称。由MikeAsh(完成相称和散列)和NSHipster(相称)写的两篇很好的文章注释了怎样做到这点。起首,让我们写isEqual::
1
2
3
4
5
6
7
8
9
10
11
-(BOOL)isEqual:(id)obj
{
if(![objisKindOfClass:[Personclass]])returnNO;
Person*other=(Person*)obj;
BOOLnameIsEqual=self.name==other.name||[self.nameisEqual:other.name];
BOOLbirthDateIsEqual=self.birthDate==other.birthDate||[self.birthDateisEqual:other.birthDate];
BOOLnumberOfKidsIsEqual=self.numberOfKids==other.numberOfKids;
returnnameIsEqual&&birthDateIsEqual&&numberOfKidsIsEqual;
}

如今,我们反省是不是我们是不异范例的类。假如不是,我们一定不相称。然后对每一个对象的属性,我们反省是不是指针是相称的。||左边的运算数仿佛是过剩的,但假如两个属性都为nil则前往YES。为了对照标量值相称像NSUInteger,我们能够只利用==。
有一件事值得注重:这里我们分红分歧的属性到他们本人的布尔值里。在理论中,大概将它们分解一个年夜的前提更成心义,由于如许你间接失掉惰性求值。在下面的例子中,假如名字不相称,我们就不必要反省任何其他的属性。经由过程把一切组分解一个if语句,我们间接失掉优化。
下一步,依照这个文档,我们必要完成一个哈希函数也是云云。Apple说:
假如两个对象相称,他们必需有不异的哈希值。假如你在子类中界说了isEqual:,而且盘算把该子类的实例放进汇合中,这最初一点就出格主要了。请确保你在你的子类中也界说了哈希。
起首,我们能够实验运转上面没有完成哈希函数的代码:
1
2
3
4
Person*p1=[[Personalloc]initWithName:namebirthDate:startnumberOfKids:0];
Person*p2=[[Personalloc]initWithName:namebirthDate:startnumberOfKids:0];
NSDictionary*dict=@{p1:@"one",p2:@"two"};
NSLog(@"%@",dict);

我第一次跑了下面的代码,统统都很好,在字典中有两个项目。第二次,只要一个了。事变变得十分不成展望了,以是我们照着文档说的来做了。
正如你大概还记得您的盘算机迷信课程中,写一个好的哈希函数不是很简单的。一个好的哈希函数必需是断定性的和匀称的。断定性意味着,在不异的输出下必要天生不异的哈希值。匀称暗示哈希函数的了局应当匀称地将输出映照在输入局限内。你的输入越匀称,你在汇合中利用这些对象的功能越好。
起首,为了弄分明,让我们来看看当我们没有一个哈希函数产生了甚么,我们实验利用Person对象作为字典的键:
<p>1
2
3
4
5
6
7
8
9
NSMutableDictionary*dictionary=[NSMutableDictionarydictionary];
<p>
简单生活 该用户已被删除
沙发
发表于 2015-1-21 11:18:55 | 只看该作者
其次学习方法和学习心态很重要,在学习当中应该保持一颗良好的心态。应该借鉴别人好的学习方法,大家互相帮助,取长补短。
小魔女 该用户已被删除
板凳
发表于 2015-1-26 23:17:27 | 只看该作者
近期由于IOS7的发布,所以应用的适配潮可谓是都搞的锣鼓喧天,甚是热闹,因此呢,因适配IOS7而产生的问题也是铺天盖地的卷来,
乐观 该用户已被删除
地板
发表于 2015-1-28 05:42:46 | 只看该作者
学习ios没什么捷径,关键在于多动手敲,曾看到前辈开玩笑说怎么快速学会某技术,答案是:“提高打字速度,快点写代码就能快点学会了”。
飘飘悠悠 该用户已被删除
5#
发表于 2015-2-5 11:46:12 | 只看该作者
重要的是,放眼全球也的确找不到第二个如苹果iOS平台这样健壮、完整、先进而且为开发者带来真实收益的开发平台来。
再现理想 该用户已被删除
6#
发表于 2015-2-6 04:55:08 | 只看该作者
down下code4app网站的每个分类的代码挨着看
飘灵儿 该用户已被删除
7#
发表于 2015-2-7 12:21:13 | 只看该作者
重要的是,放眼全球也的确找不到第二个如苹果iOS平台这样健壮、完整、先进而且为开发者带来真实收益的开发平台来。
变相怪杰 该用户已被删除
8#
发表于 2015-2-11 10:10:25 | 只看该作者
看完这个你就可以有多种选择来踏入做应用的阶段
小妖女 该用户已被删除
9#
发表于 2015-2-16 20:08:47 | 只看该作者
然而,在vmware软件环境下,安装Mac OS X操作系统也是一件非常复杂的事情,而且还有可能花费了大量时间,最后却跑不起来。笔者也是经过了大量的实践,
金色的骷髅 该用户已被删除
10#
发表于 2015-3-5 08:23:57 | 只看该作者
因为我们老师也是自学的,给我们讲课说的最多的就是百度,谷歌,查文档。
山那边是海 该用户已被删除
11#
发表于 2015-3-6 02:51:20 | 只看该作者
其实在培训的过程中,学习到最多的就是查资料的方式,当时感觉老师好坑,什么都不告诉我们,让我们自己去查,但是现在觉得还是要自己解决问题,这样才能理解的更加深入。
只想知道 该用户已被删除
12#
发表于 2015-3-10 01:26:46 | 只看该作者
有办法利用自己手头的电脑立刻开始这个美妙旅程的。
因胸联盟 该用户已被删除
13#
发表于 2015-3-15 12:10:31 | 只看该作者
重要的是,放眼全球也的确找不到第二个如苹果iOS平台这样健壮、完整、先进而且为开发者带来真实收益的开发平台来。
灵魂腐蚀 该用户已被删除
14#
发表于 2015-3-18 14:25:36 | 只看该作者
众多研发人员积极参与到iOS平台的开发中来也就不足为奇了。
兰色精灵 该用户已被删除
15#
发表于 2015-3-20 11:16:17 | 只看该作者
才在自己的Windows电脑上安装配置成功了一个完美的Mac OS X Lion(10.7.4)系统,而且下载了Xcode4.5的最新版本。虽然不能实机调试,但是作为iOS开发学习已经非常完美了。
深爱那片海 该用户已被删除
16#
发表于 2015-3-21 10:50:13 | 只看该作者
中国如今已然发展成为一个软件大国,软件人才的数量跃居全球之首。当然,在苹果平台的开发领域,也保持了相当强劲的发展势头。然而,很多初入iOS开发门槛的开发者,
17#
发表于 2015-3-26 21:18:03 | 只看该作者
有办法利用自己手头的电脑立刻开始这个美妙旅程的。
活着的死人 该用户已被删除
18#
发表于 2015-3-27 05:10:37 | 只看该作者
最后在做项目的时候一定要认真对待,毕竟这个直接和你的就业挂钩,这也是锻炼你实际操作的能力。
海妖 该用户已被删除
19#
发表于 2015-4-6 04:10:54 | 只看该作者
中国如今已然发展成为一个软件大国,软件人才的数量跃居全球之首。当然,在苹果平台的开发领域,也保持了相当强劲的发展势头。然而,很多初入iOS开发门槛的开发者,
不帅 该用户已被删除
20#
发表于 2015-4-16 08:09:29 | 只看该作者
中国如今已然发展成为一个软件大国,软件人才的数量跃居全球之首。当然,在苹果平台的开发领域,也保持了相当强劲的发展势头。然而,很多初入iOS开发门槛的开发者,
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-29 08:07

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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