在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;
}
网友评论