OC核心语法(1)点语法、变量作用域、@property@synthesize和id

来源:互联网 发布:评价刘雯 孙菲菲 知乎 编辑:程序博客网 时间:2024/05/22 04:26

一、点语法

    1.本质:

点语法的本质是方法的调用,而不是访问成员变量,当使用点语法时,编译器会自动展开成相应的方法。


切记点语法的本质是转换成相应的set和get方法,如果没有set和get方法,则不能使用点语法

如:

Stu.age=10;    展开为:[stu setAge:10];

int  a=stu.age; 展开为:[stu age];

编译器如何知道是set方法还是get方法?主要是看赋值(可以使用断点调试来查看)

在OC中访问成员变量只有一种方式即使用-> 如stu->age,这种情况要求在@public的前提下

    2.使用注意: set和get方法中的死循环

1>在set方法中,self.age=age;相当于是[self setAge:age];

2>在get方法中,return self.age;相当于是[self age];


二、变量作用域

    1.变量作用域的四个关键字

1>@public (公开的)在有对象的前提下,任何地方都可以直接访问。

2>@protected (受保护的)只能在当前类和子类的对象方法中访问

3>@private (私有的)只能在当前类的对象方法中才能直接访问

4>@package (同一框架内)作用域介于私有和公开之间,只要处于同一个框架中就可以直接通过变量名访问

    2.注意点

1>在@interface声明中自定义变量类型是 @protected

2>在@implementation实现中自定义变量类型是 @private

3>@implementation不能定义和@interface同名的成员变量


三、@property和@synthesize

    1. @property关键字 

可以自动生成某个成员变量的setter和getter的方法声明

@property int age;  // 会自动生成_age成员变量

// int是get方法的返回值类型和set方法的形参类型。 age是set形参名和get的方法名

           自动生成 

- (void)setAge:(int)age;- (int)age;

    2. @synthesize关键字

自动生成set方法和get方法的实现,并且会访问_age这个成员变量

@synthesize age = _age; // 代表形参age会访问_age这个成员变量,如果无_age,则会自动生成

- (void)setAge:(int)age{    _age=age;}- (int)age{    return _age;}

@synthesize age; // 代表默认访问age成员变量,如果没有,则自动生成age成员变量

//如果_age在类中不存在,则会自动生成@private类的age

     注:如果手动实现了setter方法,则编译器就只会自动生成getter方法
            如果手动实现了getter方法,则编译器自动生成setter方法方法
    3.注意点

方法调用时,会优先调用手工编写的方法,如果没找到再调用自动生成的方法。

@property会自动生成_成员变量名。

@property age; // 自动生成_age,类型是@private;

@synthesize 会自动生成 成员变量名。

@synthesize age; // 自动生成age,类型是@provate;


四、id

    1.概念:万能指针,能指向或操作任何OC对象。

    2.注意:已经包含了* ,在调用时不需要加* ,相当于NSObject  *

// id 类型的定义typedef struct objc object{Class isa;} *id;


0 0
原创粉丝点击