凡是符合系统默认setter、getter书写格式的方法都可以使?用点语 法。
#import "Student.h"
@implementation Student
- (void)setAge:(int)newAge {
age = newAge;
}
- (int)age {
return age;
}
@end
#import <Foundation/Foundation.h>
#import "Student.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Student *stu = [[Student alloc] init];
// 设置age的值
stu.age = 10; // 等价于[stu setAge:10];
// 取出age的值
int age = stu.age; // 等价于int age = [stu age];
NSLog(@"age is %i", age);
[stu release];
}
return 0;
}
注意:在设置age的值时,将原来的[stu setAge:10]替换成stu.age = 10,两个式子完全等价,这也就是说,stu.age并不是直接访问stu对象的变量age,而是编译器遇到stu.age的时候,会自动将代码展开为[stu setAge:10]。直接访问应是stu->age,而非stu.age。
stu.age = 10 [stu age]的转换过程类似。
总结:OC点语法的本质是方法调用,不是直接访问成员变量。
验证方法:在get与set方法中设置NSLog输出语句。
点语法与self的陷阱:
1 - (void)setAge:(int)newAge {
2 self.age = newAge;
3 }
错误:会造成死循环。
self.age相当于[self setAge:newAge];
自身调用自身。。。。。