OC语言--点语法

一、点语法

为了让其他语言的开发人员能快速的上手OC语言,因为其他语言例如java、c++等语言用点语法,而OC中的set方法的调用
为[对象 setter:参数],例如:[p setAge: 10],这种格式的调用在其他语言中没有相似的语法,所以苹果公司开发了点语法,点语法主要是替换setter、getter。

二、点语法替代set方法、get方法的调用:

一般set方法、get方法的调用:
Person *p = [Person new];
[p setAge] = 10;    //调用set方法
int a = [p age];    //调用get方法
NSLog(@"%d", a);
应用点语法的set方法、get方法的调用:
Person *p = [Person new];
p.age = 10;            //用点语法替代set方法
int a = p.age;        //用点语法替代get方法
NSLog(@"%d", a);
注意:点语法不是访问成员变量,p->_age才是访问成员变量。

解释:点语法是编译器特性,当编译器遇到p.age时会将p.age转为[p setAge]或[p age]。

编译器如何区分点语法转为get方法还是set方法?
如果p.age是赋值,则编译器会将点语法转为set方法,如果p.age是取值则编译器会将点语法转为get方法。
所以点语法根据是否赋值来区分采用set方法或get方法的。
死循环:点语法应用的时候要注意是否会引发死循环
1.set方法中的死循环
-(void) setAge:(int)age
{
    //_age = age;    直接赋值
    self.age = age;    //[self setAge:age] 引发死循环
}
解释:注意这个set方法是错误的,会引发死循环。self.age是赋值语句,编译器会将self.age转为[self setAge];
则语句变为:[self setAge: age],当对象调用set方法的时候会进入setAge方法中,当遇到self.age = age语句的时候,
就会再次调用set方法(当前方法),则会一直在set方法中一直循环。
2.get方法中的死循环
- (int)age
{
    return self.age;//[self age] 引发死循环
}
解释:注意这个get方法是错误的,会引发死循环。跟set方法类似,self.age是不是赋值,编译器会将self.age转为[self age];
当对象调用get方法的时候会进入age方法中,当遇到return self.age;语句的时候,就会进入get方法(当前方法),则会一直在get方法中一直循环。
3.所以set、get方法的正确写法:
-(void) setAge:(int)age
{
    _age = age;                // 直接赋值
    //self -> _age = age;    这种赋值是正确的
}
- (int)age
{
    return _age;            // 直接返回
    //return self -> _age;    这种写法也是正确的
}
总结:
1.点语法的本质是方法调用。
2.点语法是编译器特性,编译器遇到点语法会将点语法转为相应的方法调用语句,然后调用方法。
3.注意点语法在set、get方法中的死循环。
4.点语法不是访问成员变量。点语法:p.age,成员变量访问:p->_age;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值