- 一、成员变量的作用域
- 二、点语法
- 三、构造方法
- 四、分类
- 五、类的本质
- 六、自动生成getter和setter方法
- 七、description方法
- 八、id类型
- 九、SEL
一、成员变量的作用域
- @public
- 在任何地方都能直接访问对象的成员变量
- @private
- 只能在当前类的对象方法中访问
- @protected(可以不写,默认)
- 能在当前类和子类的对象方法中直接访问
- @package
- 只要处在同一个框架中,就能直接访问对象的成员变量
- @interface和@implementation中不能声明同名的成员变量
- 在@implementation中声明变量,默认是@private的
二、点语法
- 点语法的本质还是方法调用,不是调用成员变量
- 编译器遇到点语法时,会把点语法转成方法
?
1 2 3 |
|
三、构造方法
- 用来初始化对象的方法,对象方法,以减号开头
- 为了让对象创建出来,成员变量就会有一些固定的值
- 重写构造方法的注意点:
- 先调用父类的构造方法([super init])
- 再进行子类内部成员变量的初始化
- + alloc 方法
- 分配存储空间
- - init 方法
- 初始化
- 实际上是这么创建对象的
?
1 |
|
- 重写NSObject类的init方法(无参数)
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
- 带参数的构造方法
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
四、分类
- 分类,在不改变原来模型的情况下,可以给某个类扩充一些方法
- 分类只能增加方法, 不能增加成员变量
- 分类方法实现中可以访问原来类中声明的成员变量
- 分类的优先级最高,方法优先去分类中去找,再去原来类中去找,最后再去父类中找
- 分类可以重写原来类中的方法,但是会覆盖掉,会导致原来的方法失效,没法再使用
- 方法调用的优先级:分类(最后参与编译的分类优先) --> 原来类 --> 父类
- 分类的应用一般是扩展系统的类的方法,比如扩展NSString类的方法
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
|
五、类的本质
- 可以使用类创建对象,但是类本身也是一个对象,是个Class类型的对象,简称“类对象
- 先利用Class创建一个Person类对象,再利用Person类对象,创建Person类型的对象
- 重写load()方法和initialize()方法
?
1 2 3 4 5 6 7 8 9 10 11 |
|
- load()方法:
- 当程序启动时,就会加载项目中所有的类和分类,而且加载后会调用每个类和分类的load方法。只会调用一次
- 当第一次使用某个类时,就会调用当前类的+initialize方法
- 先加载父类,再加载子类(先调用父类的load方法,再调用子类的load方法)
- 先初始化父类,再初始化子类(先调用父类的initialize方法,再调用子类的initialize方法
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
六、自动生成getter和setter方法
- @property自动生成某个成员变量的声明
- @synthesize自动生成getter和setter的实现,并且会访问指定的成员变量
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
- @synthesize可以不写,只写@property就可以完成成员变量getter和setter方法的声明和实现
七、description方法
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
|
八、id类型
- id是一种类型
- id是万能指针,能操作任何OC对象,id内部已经包含*,所以不用再加*
- 示例:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
九、SEL
- SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法地址,找到方法地址就可以调用方法
- 其实消息就是SEL
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
|