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

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中不能声明同名的成员变量


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值