———Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ———
点语法的本质还是方法调用
如: stu.age =10; 就相当于对象stu掉用了setAge方法,[stu setAge:10];
int a = stu.age; 获取age的值并赋值给变量a,就相当于对象stu调用了age的get方法: int a = [stu age];
当使用点语法的时候,编译器会自动展开成相应的方法:如下图所示:
如何看点语法是set还是get方法?如果是把点语法赋值给其他变量的的话那就是get方法,如果是给点语法赋值那就是set方法
简单点来说,给点语法赋值就是set方法,通过点语法返回值就是get方法。
验证:
p.name = @"JACK";
NSString *s = p.name; // 在setName方法中返回"rose"
NSLog(@"%@",s); // 此时打印出的s是rose,并不是JACK
在setName方法中返回"rose", 此时打印出的s是rose,并不是JACK,如果p.name是访问成员变量的话,那么打印应该是JACK,所以充分说明了点语法是方法调用,并不是访问成员变量。
注意:会引发死循环的写法
- (void)setAge:(int)age
{
_age=age;
NSLog(@"setAge方法");
// 会发生死循环
// self.age = age; // [self setAge:age];
}
同样,在get方法中,使用self也会引发死循环
- (int)age
{
NSLog(@"age方法");
return _age;
// 或者是 self->_age;
// 也会引发死循环
// return self.age;
}
成员变量的作用域
成员变量的作用域分为四种:
@public : 在任何地方都能直接访问对象的成员变量
@private : 只能在当前类的对象方法中直接访问
@protected : 可以在当前类及其子类的对象方法中直接访问(默认就是@protected)
@package : 只要处在同一个框架中,就能直接访问对象的成员变量
注意:1.在@implementation中也可以声明成员变量,默认就是private的,就算是写了public也是没有用的。
2.@interface中声明的成员变量默认是protected的
3.@interface和@implementation不能声明同名的成员变量