1、使用
#import <Foundation/Foundation.h>
@interface Person : NSObject{
NSString *_name;
int _age;
}
//set方法
-(void)setName:(NSString*)name;
-(void)setAge:(int)age;
//get方法
-(NSString*)name;
-(int)age;
@end
@implementation Person
-(void)setAge:(int)age{
_age = age;
NSLog(@"调用了setAge方法");
}
-(void)setName:(NSString *)name{
_name = name;
NSLog(@"调用了setName方法");
}
-(int)age{
NSLog(@"调用了getAge方法");
return _age;
}
-(NSString *)name{
NSLog(@"调用了getName方法");
return _name;
}
@end
int main(int argc, const char * argv[])
{
@autoreleasepool {
//使用传统set和get
NSLog(@"----------使用传统set和get----------");
Person *p = [Person new];
[p setName:@"Amos"];
[p setAge:23];
NSString * name = [p name];
int age = [p age];
NSLog(@"name = %@, age = %d",name,age);
NSLog(@"----------使用点语法-----------");
//使用点语法
Person *p2 = [Person new];
//此处不是直接访问实例变量,而是Xcode遇到点语法出现在等号左侧,会自动把p2.name=@"Allen"替换成[p2setName:@"Allen"];
p2.name = @"Allen";
p.age = 22;
//此处Xcode遇到点语法出现在等号右侧,会地总把p2.name替换成[p2 name]
NSLog(@"name = %@, age = %d",p2.name, p2.age);
//总结,Xcode把p2.name替换成set还是get取决于该点语法出现在等号的左侧还是右侧
}
return 0;
}
打印结果:
2015-10-05 08:20:56.757 Day20[565:303]----------使用传统set和get----------
2015-10-05 08:20:56.759 Day20[565:303]调用了setName方法
2015-10-05 08:20:56.760 Day20[565:303]调用了setAge方法
2015-10-05 08:20:56.760 Day20[565:303]调用了getName方法
2015-10-05 08:20:56.761 Day20[565:303]调用了getAge方法
2015-10-05 08:20:56.761 Day20[565:303] name = Amos, age = 23
2015-10-05 08:20:56.762 Day20[565:303]----------使用点语法-----------
2015-10-05 08:20:56.762 Day20[565:303]调用了setName方法
2015-10-05 08:20:56.763 Day20[565:303]调用了setAge方法
2015-10-05 08:20:56.763 Day20[565:303]调用了getName方法
2015-10-05 08:20:56.763 Day20[565:303]调用了getAge方法
2015-10-05 08:20:56.764 Day20[565:303] name = Allen, age = 0
2、注意事项
1)set死循环
-(void)setAge:(int)age{
self.age = age;
}
这样会自身调用自身,陷入死循环,相当于
-(void)setAge:(int)age{
[self setAge:age];
}
2)get死循环
-(int)age{
return self.age;
}
这样也是死循环相当于
-(int)age{
return [self age];
}
3、点语法的本质
是方法的调用,而不是直接访问实例变量,如果没有声明定义对应的set和get方法,就会报错了