您的位置:首页 > 移动开发 > Objective-C

【Objective-C】09-OC中的点语法和成员变量的作用域

2015-02-04 17:23 302 查看
1、点语法的来由

对对象成员变量的操作,最常规的做法是让成员变量私有化,让外界使用公共的get方法和set方法访问成员变量。很多其他的高级语言都有点语法,为了让其他行业的程序员快速上手OC,OC中也引入了点语法,只不过它的含义跟其他语言不太一样。

2、点语法的本质

2.1 点语法的本质是方法的调用,其实是XCode在内部进行转换。

如:p.age = 10 自动转换为 [p setAge:10];

int a=p.age 自动转换为 int a = [p age];
以上的转换是编译器的特性,即编译器碰到点语法的语句时,会自动转换为后面的语句。
2.2 点语法访问的不是成员变量,OC中访问成员变量用的是->。
2.3 点语法代表的是get方法还是set方法,要结合当前代码语境来分析。如果是取值,则访问的是get方法;如果是设值,访问的是set方法。

3、注意:

3.1 由于点语法访问的是对象的get方法和set方法,因此类中必须要有对相应的get方法和set方法的声明和实现。否则编译时会报错。
3.2 不能在setAge方法内部使用 self.age=age这种方式进行赋值。因为会转换为[self setAge:age]而造成死循环。

4、验证
如何验证点语法调用的是对象的get方法和set方法
可以在get方法和set方法中调用NSLog打印一些信息,在main函数中使用点语法,如果打印出相应的信息的话,证明确实调用的是get方法和set方法。

#import <Foundation/Foundation.h>
@interface Student:NSObject
{
int _age; // 年龄
}

//声明ge的get和set方法
- (void)setAge:(int)age;
- (int)age;
@end

@implementation Student
//实现age的get和set方法
- (void)setAge:(int)age
{
NSLog(@"点语法调用set方法"); //测试是否调用了set方法
_age=age;

//会引发死循环
//self.age=age;  // 相当于[self setAge:age];
}
- (int)age
{
NSLog(@"点语法调用get方法"); //测试是否调用了get方法
return _age;

//会引发死循环
//return self.age; // 相当于 retrun [self age];
}
@end

int main(){
Student *stu = [Student new]; //创建一个Student对象
stu.age=10;        //等价于 [stu setAge:10];
int a = stu.age;   //等价于 int a=[stu age];
NSLog(@"学生的年龄是%d岁",a); //打印年龄
return 0;
}


输出结果:

2015-02-04 05:57:12.798 a.out[476:6728] 点语法调用set方法

2015-02-04 05:57:12.800 a.out[476:6728] 点语法调用get方法

2015-02-04 05:57:12.800 a.out[476:6728] 学生的年龄是10岁

5、补充:成员变量的作用域

@public : 在任何地方都能直接访问对象的成员变量

@private : 只能在当前类的对象方法中直接访问(@implementation中默认是@private)

@protected : 可以在当前类及其子类的对象方法中直接访问 (@interface中默认就是@protected)

@package : 只要处在同一个框架中,就能直接访问对象的成员变量

@interface和@implementation中不能声明同名的成员变量
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐