三十二

三十二
类名、协议名

应该为类与协议的名称加上前缀,以避免命名空间冲突(因为OC其实没有命名空间),而且应该像给方法起名时那样把词句组织好,使其从左至右读起来较为通顺。

UITableView(类)
  这是一种特殊类型的视图,可以显示表格中的一系列条目。所以,它在超类(UIView)名称中的 View 一词前面加了 Table 这个修饰词,用以和其他类型的视图相区隔。在超类名称前加修饰语是一种常用的命名惯例。本类也可以叫做 UITable,不过这个名字无法完整传达出 “视图”这个概念。开发者必须查看接口声明方能确定这一点。比方说,想创建一个专门用来显示图像的表格视图,那么就可以将这个继承自 UITableView 的子类命名为 EOCImageTableView。不过这时要加上自己的前缀 EOC,而不是沿用超类的前缀 UI (UIKit 框架中的类以 UI 为前缀)。这么做的原因在于,你不应该把自己的类放到其他框架的命名空间里面。那些框架以后也许会新建同名的类。
命名方式应该协调一致。如果要从其他框架中继承子类,那么务必遵循其命名惯例,并替换为自己的前缀;若要创建自定义的委托协议,则其名称中应该包含委托发起方的名称,后面再跟上 Delegate 一词。

为私有方法名加前缀

一个类经常要写一些只在内部使用的方法。建议应该为这种方法的名称加上某些前缀,好处:
有助于调试,因为这样容易区别公共方法和私有方法。
便于修改方法名或方法签名。修改公共方法,那么使用了这个类公共方法的代码都需要更新,而修改私有方法,只需要修改本类内部相关代码即可。用前缀把私有方法标出,容易看出哪些可以随意修改,哪些不应轻易改动。
继承第三方库类的时候,避免和他们的私有方法重名导致意外覆写。

苹果内部代码是以_下划线作为私有方法前缀的,如果我们也用下划线,可能不经意的继承并覆写了超类的某个方法,导致调用时机不可预测。

Objective-C语言没办法将方法标为私有。每个对象都可以响应任意消息,而且可在运行期检视某个对象所能直接响应的消息。根据给定的消息查出其对应的方法,这一工作要在运行期才能完成,所以Objective-C中没有那种约束方法调用的机制用以限定谁能调用此方法、能在哪个对象上调用此方法以及何时能调用此方法。

NSError
NSError的用法灵活,因为经由此对象可以把导致错误的原因回报给调用者。NSError对象里封装了三条信息:
Error domain(错误范围,其类型为字符串)
错误发生的范围。也就是产生错误的根源,通常用一个特有的全局变量来定义。

Error code(错误码,其类型为整数)
独有的错误代码,用以指明在某个范围内具体发生了何种错误。

User info(用户信息,其类型为字典)
有关此错误的额外信息,其中或许包含一段"本地化的描述"(localized description),或许还含有导致该错误发生的另外一个错误,经由此种信息,可将相关错误串成一条"错误链"(chain of errors)。

传递给方法的参数是个指针,而该指针本身又指向另外一个指针,那个指针指向NSError对象。或者也可以把它当成一个直接指向NSError对象的指针。这样一来,此方法不仅能有普通的返回值,而且还能经由"输出参数"把NSError对象回传给调用者。
在使用ARC时,编译器会把方法签名中的NSError转换成NSError__autoreleasing,也就是说,指针所指的对象会在方法执行完毕后自动释放。这个对象必须自动释放,因为"doSomething:“方法不能保证其调用者可以把此方法中创建的NSError释放掉,所以必须加入autorelease。
必须先保证error参数不是nil,因为空指针解引用会导致"段错误”(segmentation fault)并使应用程序崩溃。调用者在不关心具体错误时,会给error参数传入nil,所以必须判断这种情况。

通过委托与数据源协议进行对象间通信
委托模式主旨是:定义一套接口,某对象若想接受另一个对象的委托,则需要遵从此接口,以便成为其“委托对象”(delegate)。而这“另一个对象”则可以给其委托对象回传一些信息,也可以在发生相关事件时通知委托对象。

如果有些是可选实现的方法一定要标注optional,然后在使用[self.delegate xxx]之前需要先判断是不是delegate实现了这个可选方法(responseToSelector)。

方法名同样也要清晰明确,并且第一个参数应该把定义delegate的对象传回去,因为有的时候可能两个object用同一个实现了的delegate的对象,这样就可以在方法内区分是哪个object触发了delegate方法。

引用计数
调用者已通过alloc方法表达了想令该对象继续存活下去的意愿。不过请注意,这并不是说对象此时的保留计数必定是1。在alloc或"initWithInt:"方法的实现代码中,也许还有其他对象也保留了此对象,所以,其保留计数可能会大于1。能够肯定的是: 保留计数至少为1。保留计数这个概念就应该这样来理解才对。绝不应该说保留计数一定是某个值,只能说你所执行的操作是递增了该计数还是递减了该计数。

为避免不经意间使用了无效对象,一般调用完release之后都会清空指针。这就能保证不会出现可能指向无效对象的指针,这种指针通常称为"悬挂指针"(dangling pointer)。
自动释放池
在Objective-C的引用计数架构中,自动释放池是一项重要特性。调用release会立刻递减对象的保留计数(而且还有可能令系统回收此对象),然而有时候可以不调用它,改为调用autorelease,此方法会在稍后递减计数(相当于执行一次release),通常是在下一次"事件循环"(event loop)时递减,不过也可能执行得更早些。

以ARC简化引用计数
由于ARC会自动执行retain、release、autorelease等操作,所以直接在ARC下调用这些内存管理方法是非法的。
ARC在调用这些方法时,并不通过普通的Objective-C消息派发机制,而是直接调用其底层的C语言版本。这样做性能更好,因为保留及释放操作需要频繁执行,所以直接调用底层函数能节省很多CPU周期。ARC会调用与retain等价的底层函数objec_retain。所以不能覆写retain、release或autorelease,因为这些方法从来不会被直接调用。
内存修饰符:
__strong: 默认语义,保留此值
__unsafe_unretained: 不保留此值,这么做可能不安全,因为等到再次使用变量时,其对象可能已经回收了。
__weak:不保留此值,但是变量可以安全使用,因为如果系统把这个对象回收了,那么变量也会自动清空。(常用与解决retain cycle)
__autoreleasing: 把对象"按引用传递"(pass by reference)给方法时,使用这个特殊的修饰符。此值在方法返回时自动释放。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值