对象名.去掉下划线的属性名;
p1.name = @"jack"; 这个时候就会将@"jack"赋值给p1对象的_name属性.
NSString *name = p1.name; 把p1对象的_name属性的值取出来.
4.1 原理: p1.age = 18; 这句话的本质并不是把18直接赋值给p1对象的_age属性.
点语法在编译器编译的时候.其实会将点语法转换为调用setter、getter的代码.
4.2 赋值,取值调用过程:
1) 当使用点语法赋值的时候. 这个时候编译器会将点语法转换为调用setter方法的代码.
对象名.去掉下划线的属性名 = 数据;
转换为:[对象名 set去掉下划线的属性名首字母大写:数据]; 如:
p1.age = 10; 会换成: [p1 setAge:10];
2) 当使用点语法取值的时候.这个时候编译器会将点语法转换为调用getter方法的代码.
对象名.去掉下划线的属性名;
转换为:[对象名 去掉下划线的属性名]; 如:
int age = p1.age; 会换成: int age = [p1 age];
4.3注意:
1) 在getter和setter中慎用点语法,因为有可能会造成无限递归 而程序崩溃,
2) 点语法在编译器编译的时候 会转换为调用setter getter方法的代码,并且方法名要符合规范.
p1.name = @"jack";
[p1 setName:@"jack"]
NSString *name = p1.name;
NSString *name = [p1 name];
3) 如果属性没有封装getter setter 是无法使用点语法的, 因为点语法的本质是getter setter方法.