美文网首页
iOS观察者造成的崩溃(死循环)

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

作者: NJHu | 来源:发表于2018-07-27 10:30 被阅读119次

在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;
}

相关文章

网友评论

      本文标题:iOS观察者造成的崩溃(死循环)

      本文链接:https://www.haomeiwen.com/subject/jpewmftx.html