《从零开始学iOS7开发系列3-我的地盘我做主-Cha20》.pdf
文本预览下载声明
从零开始学iOS7开发系列3-我的地盘我做主-Cha20
说明:
本系列⽂章的原⽂及⽰例代码来⾃raywenderlich store中的iOS Apprentice 系列3教程,经过翻译
和改编。
版权归原作者所有,本系列教程仅供学习参考使⽤,感兴趣的朋友建议购买原英⽂教程教程(The
iOS Apprentice Second Edition: Learn iPhone and iPad Programming via Tutorials!)。
购买链接:
/store
欢迎继续我们的学习。
⾸先让我们来点理论知识充电吧。
Object graph(对象图)
对象可不像修⼠,在深⼭之中云深不知处。我们的应⽤中有很多对象,它们需要在⼀起共同⼯作。
对象之间的关系被称为object graph (对象图)。
⽐如在这款应⽤中,CurrentLocationViewController就和⼏个对象之间有⼀定的关联:
这些对象是它所拥有的实例变量和属性,或者换句话说是它所“拥有”的对象。但这只是个开始,
CurrentLocationViewController本⾝被其它对象所拥有,⽐如它属于UITabBarController,⽽
UITabBarController则属于UIWindow。
当然,到了这⾥,我们也仅仅看到了当前应⽤的对象图的⼀⼩部分。对象图显⽰了不同对象之间
的所属关系。(不要把对象图和类层级图弄混了。类层级图显⽰的是对象的数据类型,⽽不是对
象本⾝)。
对象的ownership (所属关系)在iOS开发中是⾮常重要的概念。我们需要建⽴⼀个清晰的图景,
了解对象之间的所属关系,因为这些对象的⽣死存亡就取决于这⼀点!如果⼀个对象没有任何的
owner (不被任何⼈需要的穷DS),那么它就会被⽴即deallocate (销毁!)。如果应⽤中还要
⽤到这个对象,就会带来毁灭性的打击(crash!)。反过来也⼀样,如果某个对象有太多的
owner(⼈⼈都想追的⽩富美),那么这个对象就会⼀直驻留在内存之中,这样就可能导致应⽤内
存空间不⾜,直到崩溃。
每个对象都可能有超过⼀个owner。例如,当⽤户触碰Tag Location按钮时,
CurrentLocationViewController会传递⼀个CLPlacemark对象给LocationDetailsViewController ,
那么视图控制器就会分享它的所有权。
我们在LocationDetailsViewController.h中使⽤以下语句对此进⾏了声明:
@property(nonatomic,strong) CLPlacemark *placemark;
通过上⾯的语句,LocationDetailsViewController就获得了⼀个新属性placemark ,同时是⼀种
strong关系。当我们把⼀个对象放到该属性变量时,Tag Location界⾯就成了该对象的共同拥有
者。
对象关系的类型有两种:strong和weak 。在strong强关系中,⼀个对象拥有另外⼀个对象的所有
权,同时还可以和其它所有者分享。在weak弱关系中,不存在此类的ownership (所属关系)。
之前我们在outlet类型的属性变量中曾经使⽤过weak属性:
@property(nonatomic,weak) IBOutlet UILabel *latitudeLabel;
之所以outlet类型的属性属于weak ,是因为视图控制器并⾮真的是它们的所有者,真实的情况
是,outlet属性变量属于视图控制器的主视图。
weak弱类型在delegate 中也经常⽤到:
@property (nonatomic, weak) id IconPickerViewControllerDelegate delegate;
上⾯的这⾏语句来⾃系列1教程中的IconPickerViewController类。图标选择器有⼀个代理对象,
它的作⽤是监听在图标选择界⾯上可能发⽣的事件。
通常情况下⼀个对象不要拥有⾃⼰的代理,因为这样会导致ownership cycle (所属关系
显示全部