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

在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;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,804评论 8 265
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,796评论 1 32
  • 面试题参考1 : 面试题[http://www.cocoachina.com/ios/20150803/12872...
    江河_ios阅读 5,677评论 0 4
  • OC语言基础 1.类与对象 类方法 OC的类方法只有2种:静态方法和实例方法两种 在OC中,只要方法声明在@int...
    奇异果好补阅读 9,789评论 0 11
  • 成品 有待改进的地方还很多 没有基础照着瞎画的,喜欢画画却没有基础的朋友也get起来吧 我都是找一张喜欢的临摹,用...
    覃格尔阅读 2,732评论 0 4