天天看点

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;

继续阅读