问题描述
比如?
- (void)setNow:(NSDate *)aDate { [self willChangeValueForKey:@'now']; _now = aDate; [self didChangeValueForKey:@'now'];}
还是直接
- (void)setNow:(NSDate *)aDate {_now = aDate; //自动调用 willChange didChange方法?}
2 如果在category里用runtime增加一个属性时,如果需要使用KVO,需要手动使用这两个方法么?
-(void)setStr:(NSString *)str { //这里需要手动使用 willChange didChange么? objc_setAssociatedObject(self, & strKey, str, OBJC_ASSOCIATION_COPY); }
问题解答
回答1:如果旧值和新值不一样,是需要手动发出通知的。关联对象无法合成setter方法,setter方法必须由程序员给出。当我们kvo这个属性时,运行时检测到我们已经实现了setter,就不会覆盖这个方法,因此无法发出通知。所以这个通知也是需要手动发出的
回答2:要手动写,不会自动调用的。