30、日期类型
Cocoa 中使用NSDate 类型表示日期。
31、数据缓冲区(其实就是java中的字节数组)
Cocoa 中使用NSData 类型来实现缓冲区,用于存储二进制的数据类型,譬如:从网络下载回来的文件等。
NSData 是长度不可变的数据缓冲区,还有一个NSMutableData 用来存储长度可变的数据缓冲区。
32、写入和读取属性(简直就是java序列化和反序列化的翻版)
在iPhone 的*.ipa 文件中,你经常可以看到*.plist 文件,它保存了程序的相关属性,叫做属性列表。其实它就是NSArray、NSDictionary、NSString、NSData 持久化之后的文件。
这几个类型都有一个成员方法writeToFile: (NSString*) file atomically: BOOL 用于将自己写入到一个文件。atomically 为YES 表示文件先存储到临时文件区,如果文件保存成功,再替换掉原始文件,这样的好处是可以防止在保存文件过程中出错,但是仅适用于小文件,因为你相当于是在临时文件存储区也放了一份,再加上原始文件,就是两份文件,如果文件比较大,将会占用较多的用户的磁盘空间。
如果你要持久化的类型不是上述的数组、字典、缓冲区,那该怎么办呢?Objective-C 中也有和JAVA 一样的序列化、反序列化支持,使用NSCoding 协议。NSCoding 协议定义了如下两个方法:
-(void) encodeWithCoder: (NSCoder*) coder;
-(id) initWithCoder: (NSCoder*) decoder;
第一个方法相当于编码对象,第二个方法是解码回对象,也就相当于给类型定义了一个新的init 方法而已。
33、对象的复制
对象的复制就相当于JAVA 中的clone()方法,也就是对象的深度复制,所谓深度复制就是重新分配一个存储空间,并将原对象的内容都复制过来,从这些描述可以看出,复制也会分配空间,那就是你要对复制出来的对象release,就是前面所说的alloc、new、copy 操作创建的对象,要手工release。
Objective-C 中的一个对象是否可以被复制,要看它的类型是否遵循NSCopying 协议,这个协议中有个复制方法-(id) copyWithZone: (*NSZone) zone 需要我们去实现。
34、多线程
Objective-C 的多线程编程与JAVA 语言极其类似分为原始的线程操作、线程池两种,后者其实就是使用队列等机制对前者的封装。JAVA 也一样,原始的线程操作使用Thread 类,线程池的操作使用java.util.concurrent.*中的类库。
Objective-C 中NSThread 类型表示线程,NSCondition 用于执行同步操作,在功能和用法上相当于JAVA 中的java.util.concurrent.*包中的Lock 对象。
另外,Objective-C 也支持@synchronized 指令做代码同步,写法也和JAVA 中的很相似。
@synchronized(要加锁的对象){
//同步执行的代码
}
另外比较有趣的是,如果你想更新UI 上的某一个部件,就需要在发起的新线程里调用UI 所在的主线程上的一个方法,新线程不能直接访问主线程的方法,需要在run 方法中使用如下的方法:
- (void) performSelectorOnMainThread: (SEL) aSelector withObject: (id) arg waitUntilDone: (BOOL) wait
如果你对java的swing熟悉的话,你应该知道在UI界,大多数更新界面的都必须在一个单线程中执行,因为如果更新界面是多线程的话会很难处理的,java swing处理的方法是更新界面的代码放在专门更新UI的线程下执行,其实这里IOS也是这么一个思想。
Objective-C 使用NSOperation、NSOperationQueue 两个类型实现线程池的操作,NSOpertion就好比JAVA 中的Runnable,其中的main(名字有点儿奇怪)方法也就是你要执行的操作,NSOperationQueue 是一个线程池队列,你只需要把NSOperation 添加到NSOperationQueue,队列就会retain 你的NSOperation,然后执行其中的操作,直到执行完毕。队列中会有多个操作,队列会按照你添加的顺序逐个执行,也就说队列中的任务是串行的。
跟java一样,如果线程池可以满足你的业务需求,尽量使用线程池,而不是原始的NSThread,因为使用线程池屏蔽了许多线程自身需要处理的问题,代码也更加简洁。
35、KVC 与KVO(这个话题真高级)
KVC 是NSKeyValueCoding 的缩写,它是Foundation Kit 中的一个NSObject 的Category,作用你可以类比JAVA 中的反射机制,就是动态访问一个对象中的属性。
KVC 在解析key 的字符串的时候,是会比你正常调用setter、getter 要慢的,而且编译器无法在编译器对你的方法调用做出检查(因为你的属性名都是字符串,只有运行时才会知道你有没有写错),出错的几率也会提高,所以请不要随意使用KVC,而省去setter、getter 方法。KVC 一般用于动态绑定,也就是运行时才能确定谁调用哪个方法,编译期并不确定。
KVO就是NSKeyValueObserving的缩写,它也是Foundation Kit中的一个NSObject的Category,KVO 基于KVC 实现,基于观察者设计模式(Observer Pattern)实现的一种通知机制,你可以类比JAVA 中的JMS,通过订阅的方式,实现了两个对象之间的解耦,但又可以让他们相互调用。(具体请查资料)
36、谓词NSPredicate
Cocoa 提供了NSPredicate 用于指定过滤条件,谓词是指在计算机中表示计算真假值的函数,它使用起来有点儿像SQL 的查询条件,主要用于从集合中分拣出符合条件的对象,也可以用于字符串的正则匹配。 |