Objective-C学习笔记(4-7)

目录

  1. 构造和拷贝构造
  2. 动态特性和RTTI
  3. 内存管理和标准C区别
  4. 监视方式
  5. 数据持久化
  6. RTTI和动态特性2
  7. 容器类、Block和NSPredicate

04监视方式

Protocol

用protocol实现的delegate。其实我觉得这个就是观察者,只不过默认情况下是单一的观察者。具体方法不总结了。

有什么方法可以一次性存放多个delegate?这样就可以用数组方法一口气通知完:

[array makeObjectsPerformSelector:@selector(doSomething:) withObject:aObject];

如果写N个变量第一比较罗嗦第二也不知道运行时会有多少个观察者。但问题在于NSArray和NSMutableArray不能存指针之外的对象,protocol实例不认。

KVO

KVO,也就是Key-Value Observer,是除了protocol和notification之外的又一种属性监视方式

监视别人的类重载一个方法,用于观察值变化

- (void) observeValueForKeyPath:(NSString*)aPath ofObject:(id)anObject change:(NSDictionary*)aChange context:(void*)aContext {
           NSLog( @"%@ has observered key %@ change in %@, from %@ to %@",
                [self class], aPath, anObject, [aChange objectForKey:@"old"], [aChange objectForKey:@"new"] );
}

被监视的类不用特意修改。

发送消息时,需要用NSObject里面某Category已经定义好的add/removeObserver增删observer即可

Coder* me = [Coder personWithName:@"Si Wei" andAge:25];
    [me setLanguage:@"C#"];
    Computer* computer = [[Computer alloc] init];
    [computer addObserver:me forKeyPath:@"workload" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionNew context:nil];
    [computer setWorkload:10];
    [computer setWorkload:50];
    [computer removeObserver:me forKeyPath:@"workload"];
    [computer release]; Read more >>>