iOS观察者造成的崩溃(死循环)

2018-07-27  本文已影响119人  NJHu

在getter 方法里边这样写会不会造成崩溃?

@interface NJPerson : NSObject

@property (nonatomic, copy) NSString *name;

@end


@implementation NJPerson

- (NSString *)name
{
    if (!Login) {
        self.name = @"0";
        NSLog(@"YES");
    }
    NSLog(@"NO");
    return _name;
}

@end

答案一: 不会

1, 因为getter方法会编译成如下代码

- (NSString *)name
{
    if (!Login) {
        //self.name = @"0";
        [self setName:@"0"];
        NSLog(@"YES");
    }
    NSLog(@"NO");
    return _name;
}

答案二:

1, 因为 外界会添加观察者KVO

[person addObsever: Anyobject forKeypath: @"name"];

2, NJPerson会有一个派生类重写setter方法


- (void)setName:(NSString *)name {
  [willChangeValueForKey: @"name" value: self.name];
  self.name=name
 [didChangeValueForKey: @"name" value: self.name];
}

3, 在setter 方法里边会调用 getter 方法, 造成死循环

所以建议不要在getter方法里边调用setter方法, 建议如下

- (NSString *)name
{
    if (!Login) {
        //self.name = @"0";
        _name = @"0";
        NSLog(@"YES");
    }
    NSLog(@"NO");
    return _name;
}
上一篇 下一篇

猜你喜欢

热点阅读