OC中的点语法,成员变量的作用域

点语法

点语法本质是函数的调用,不是像java中那样,是用来访问成员变量的;oc中访问成员变量是用 -> 访问的;

Person *p = [Person new];

p.age = 10; // 如果点语法是进行了赋值操作,那么就相当于调用了setter方法;

[p.age]; // 这样不赋值相当于调用了getter;

注意点:

尽量不要在setter或getter中调用点语法,容易引发死循环;死循环是由于递归调用引发的;

// 在setter调用点语法

- (void)setAge:(int)age
{
     _age = age;
     self.age = 10;  // 这个setter会无限重复的递归,而没有递归结束的条件;
}

 成员变量的作用域:或者叫权限修饰符

注意理解“直接访问”这四个字,是指通过对象名直接访问,不是通过setter和geter,这样就不叫直接访问了;

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

@private:只能在本类的对象方法中直接访问,需要注意子类虽然不能直接访问,但是子类任然具有该属性,科通过父类的getter和setter访问

@protected:能在本类和子类的对象方法中直接访问

@package:在同一个框架中可以直接访问

没有添加任何修饰符,直接定义的成员变量,默认是protected,前提是这个成员变量是定义在@interface中的,注意在@implementation中也可以定义成员变量,而在这里定义的成员变量默认是@private,因为.m文件是不会被别人包含的;但是在implementation中声明的成员变量是不能和@interface中的成员变量重名的;

原文地址:https://www.cnblogs.com/cxbblog/p/3720604.html