close
当前位置: 物联网在线 > 技术文库 > ios >

那些设计iOS API需要知道的事(2)

6)将get这个前缀留给那些借由“输出参数”来保存返回值的方法,比如说,把返回值填充到“C语言式数组”(C-style array)里的那种方法就可以使用这个词做前缀。

类与协议命名

不仅仅是方法,类和协议也应该加上前缀,避免命名空间冲突。例如:

UIView

UIViewController

UITableViewDelegate

错误模型

目前有很多编程语言都有“异常”(exception)机制,Objective-C也不例外。

“自动引用计数”(ARC, Automatic Reference Counting)在默认情况下不是“异常安全的”。这意味着:如果抛出异常,那么本应该在作用域末尾释放的对象现在却不会自动释放了。如果想生成“异常安全”的代码,可以通过设置编译器的标志来实现,不过这将引入额外代码,在不抛出异常时,也照样要执行这部分代码。需要打开的编译器标志叫做 -fobjc-arc-exception 。

Objective-C现在所采用的办法是:只在极其罕见的情况下抛出异常,异常抛出之后,无须考虑恢复问题,而且应用程序此时也应该退出。这就是说,不用再编写复杂的“异常安全”代码了。

异常只应该用于极其严重的错误,比如,你编写了某个抽象基类,它的正确用法是先从中继承一个子类,然后使用这个子类。在这种情况下,如果有人直接使用了这个抽象基类,那么可以考虑抛出异常。与其他语言不同,Objective-C中没办法将某个类标识为“抽象类”。要想达成类似效果,最好的办法是在那些子类必须覆写的超类方法里抛出异常。

异常只用于处理严重错误(fatal error),对于其他错误,Objective-C语言所用的编程范式为:令方法返回nil/0,或使用NSError,以表明有错误发生。

NSError对象里封装了三条信息:

Error domain (错误范围,其类型为字符串)

错误发生的范围,也就是产生错误的根源,通常用一个特有的全局变量来定义。例如,URL-handling-subsystem,在从URL中解析或获取数据时如果出错了,那么就使用NSURLErrorDomain来表示错误范围。

Error code (错误码,其类型为整数)

独有的错误码,用以指明在某个范围内具体发生了何种错误。某个特定范围内可能会发生一系列相关错误,这些错误情况通常采用enum来定义。

User info (用户信息,其类型为字典)

有关此错误的额外信息,其中或许包含一段“本地化描述”,或许还包含有导致该错误发生的另外一个错误,经由此种信息,可将相关错误串成一条“错误链”。

使用不可变对象

设计类的时候,应充分使用属性来封装数据。而在使用属性时,则可将其声明为 readonly 。默认情况下,属性是 readwrite 。

因为如果把可变对象(mutable object)放入collection之后又修改其内容,那么很容易就会破坏set的内部数据结构,使其失去固有的语义。故此,我们应该尽量减少对象中的可变内容。具体到编程实践中,则应该尽量把对外公布出来的属性设为 readonly ,而且只在有必要时才将属性对外公布。

定义类的公共API时,需要注意,对象里表示各种collection的那些属性究竟应该设成可变的,还是不可变的。如果某个属性可以为外界所增删,那么这个属性就需要用可变的set来实现。在这种情况下,通常应该提供一个readonly属性供外界使用,该属性将返回不可变的set,而此set则是内部那个可变set的一份拷贝。

// ZKRPointOfInterest.h #import <UIKit/UIKit.h> @interface ZKRPointOfInterest : NSObject @property (nonatomic, copy, readonly) NSString *identifier; @property (nonatomic, copy, readonly) NSString *title; @property (nonatomic, assign, readonly) CGFloat latitude; @property (nonatomic, assign, readonly) CGFloat longitude; @property (nonatomic, strong, readonly) NSSet *locations; - (instancetype)initWithIdentifier:(NSString *)identifier title:(NSString *)title latitude:(CGFloat)latitude longitude:(CGFloat)longitude; - (void)addLocation:(ZKRPointOfInterest *)location; - (void)removeLocation:(ZKRPointOfInterest *)location; @end // ZKRPointOfInterest.m #import "ZKRPointOfInterest.h" @implementation ZKRPointOfInterest { NSMutableSet *_internalLocations; } - (instancetype)initWithIdentifier:(NSString *)identifier title:(NSString *)title latitude:(CGFloat)latitude longitude:(CGFloat)longitude { self = [super init]; if (self) { } return self; } - (NSSet *)locations { return [_internalLocations copy]; } - (void)addLocation:(ZKRPointOfInterest *)location { if (location) { [_internalLocations addObject:location]; } } - (void)removeLocation:(ZKRPointOfInterest *)location { [_internalLocations removeObject:location]; } @end

注意:不要在返回的对象上查询类型以确定其是否可变。(即使不用 isKindOfClass: 方法来判断返回值类型是否可变)

description方法

在调试程序时,经常需要打印并查看对象信息。一种办法是编写代码把对象的全部属性都log到日志中。 NSLog(@"object=%@", object);


(责任编辑:ioter)

用户喜欢...

聊一聊iOS的那些生命周期

iOS应用程序的生命周期,还有程序是运行在前台还是后台,应用程序各个状态的变换,这些对于开发者来说都是很重要的。iOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的...


iOS 开发周报:苹果正在重新设计 Mac Pro、Weex 布局引擎(Yoga)探究

苹果正在重新设计 Mac Pro :苹果正在加班加点开发一款 完全重新思考 的 Mac Pro,采用模块化设计,可以为高端 CPU 和 GPU 提供空间,而且未来的升级也将更加方便。苹果还在开发自有品牌的专...


iOS的那些面试

笔试面试是程序员应聘绕不过的坎,想进大厂就一定要有知识储备量,而这个却是最佳的考察方式。笔者分享一些收集的iOS面试题,答案仅供参考,如有错误,还请指正。 第一部分 1.Objecti...


iOS 组件化 —— 路由设计思路分析

前言 随着用户的需求越来越多,对App的用户体验也变的要求越来越高。为了更好的应对各种需求,开发人员从软件工程的角度,将App架构由原来简单的MVC变成MVVM,VIPER等复杂架构。更换适合...


iOS 导航栏的那些事儿

最近项目里有个需求和导航栏的样式定制有关,深入之后发现之前理解的一些概念有些模糊,刚好趁着这次机会全面整理了一下。 从 iOS7 开始,苹果采用了大量的扁平化和毛玻璃风格,刚升...


iOS那些“垃圾”的轮播

轮播视图通常也叫Banner,90%以上App都会用到的一个控件,网上有很多开源代码,但是至今我觉得比较好的一个是 SDCycleScrollView ,因为他解决了我接下来要吐槽的两个问题。 通常实现定时自动...


iOS开源 - 复制 iOS 样式库到 Sketch 以改善、加速设计流程

I’ve decided to take styles from Xcode and do my best to replicate them for Sketch. Along the way, I documented the process of how I ended up with the result so you can look into things even further. UIBlurEffectStyle The API doesn't provide any...


Java开发者需要了解的移动开发编程语言

移动应用开发行业在过去的五年里飞速地成倍增长,改变了全球企业功能。随着企业在最近一段时间调整移动应用到他们的生产力,以及他们跨平台移动设备的快速创新;它需要移动应用程序...


总结iOS开发中的断点续传那些事儿

前言 断点续传概述 断点续传就是从文件赏赐中断的地方重新开始下载或者上传数据,而不是从头文件开始。当下载大文件的时候,如果没有实现断点续传功能,那么每次出现异常或者用户主...


使用WKWebView遇见的那些坑

iOS8之后出了WKWebView,据说加载速度和内存占用情况都甩UIWebView好几条街,鉴于我们公司的项目用到挺多的webView,于是简单的调研下决定用WKWebView替换UIWebView。WKWebView的使用方法不多少,相信...