特有语法
1. 类的本质
1.首先内存的五大区域有:
-
栈
-
堆
-
BSS段
-
数据段
-
代码段:用来存储代码
2.下面来讨论三个问题:
第一个和第三个问题已经回答,下面来回答第二个问题
3.类是以什么样的形式存储在代码段的
用示意图表示即为:
4.如何拿到存储在代码段中的类对象.
调用方法如下所示:
5.如何使用类对象(也就是class对象).
注意class 对象 就相当于代码段中相应的 类。
2. SEL
这一小节比较绕,可以参考最下面链接中B站的P93,P94的视频
1.SEL全称叫做selector选择器。SEL是1个数据类型,所以要在内存中申请空间存储数据。SEL其实是1个类,SEL对象是用来存储1个方法的。
2.类是以Class对象的形式存储在代码段之中.
用示意图表示如下所示:
3.拿到存储方法的SEL对象
4.调用方法的本质.
用示意图表示如下所示:
5.重点掌握
6.手动地为对象发送SEL消息.
7.注意事项:
总结:
3. 点语法
1.OC的对象如果要为属性赋值或者取值就要调用对应的getter或者setter方法.
OC中setter方法是一个对象方法,函数名即为变量名(如果变量名前面有下划线,需要把下划线去掉),无输入,返回变量值
OC中getter方法是一个对象方法,函数名即为“set+变量名”(如果变量名前面有下划线,需要把下划线去掉),输入变量值,无返回值。
如:
2.使用点语法来访问对象的属性.
3.点语法的原理,
4.注意事项
4. @property
1.我们写一个类需要以下步骤
2.@property的作用、语法和原理
3.使用@property的注意事项
这里的写法是Xcode4.4之前的写法。从Xcode4.4以后Xcode对@property做了1个增强,下面就会讲到(也就是@property同时做了声明和实现)。
5. @synthesize
1.@synthesize存在的动机
2.synthesize的作用、语法、它的本质
3.如果希望@synthesize不要去自动生成私有属性了,那么应该如何操作呢?
4.注意事项
5.关于property和synthesize的批量声明
6. @property增强
上面@property的解释是Xcode4.4之前的用法。从Xcode4.4以后Xcode对@property做了1个增强,将setter和getter 的声明和实现合二为一,就用@property即可。
2.@property增强
3.使用注意事项
4.从今以后,一个@propert就能搞定属性的私有化,以及setter和getter 的所有事情
5.继承
7. 动态类型和静态类型
1.OC是1门弱语言。编译器在编译的时候,语法检查的时候没有那么严格,不管你怎么写都是可以的。
2.静态类型和动态类型的区别
3.编译检查
4.运行检查
5.子类对象指向父类对象时编译器是不会报错的,但是如果去执行子类特有的方法时,运行时会报错,因为父类没有那个方法。(简单来记就是,编译看左边(变量类型,子类对象),运行看右边(变量值,父类对象))
8. id类型
1.根据里氏替换原则所述,父类指针能够指向所有子类对象,所以NSObject指针能够指向任何对象,但是在调用子类特有方法时就需要做类型转换。
2.id指针也是一个万能指针
3.id指针能够弥补NSObject指针的不足,不需要类型转换就可以调用子类特有方法(即能通过编译,不做编译检查)。但是注意id指针只能调用对象方法,但不能使用点语法。
9. instancetype类型
如果父类中的类方法创建1个父类对象返回,即如下所示:
那么此时如果子类继承了父类,那么子类也会拥有这个类方法,但是这个类方法却无法返回子类指针地址,而是返回父类指针地址,指向一个父类对象,这是会报错的。
那么解决方法是怎么样的呢?如下所述,做到两点即可:return 中使用self调用new这个类方法,返回值使用instancetype代表当前类的对象(使用id指针也可以,但问题在于任意指针都可以接受这个类方法的返回值,编译器不会报错,而instancetype会报错)
关于instancetype的使用建议和它与id指针的区别
10. 动态类型检测
在程序运行时需要先编译后运行,所以需要同时做编译检查和运行检查。
在实际中,我们希望在运行的时候先判断此对象是否有该方法,如果有就执行该方法,没有就不执行该方法。
下面两个方法需要掌握,是判断依据。第一个方法是判断对象中是否有这个方法可以执行。第二个方法是判断类中是否有指定的类方法.。
第一个方法范例:
第二个方法使用范围:
下面三个方法了解即可,分别是
-
判断指定的对象是否为指定类的对象或者子类对象.
-
判断对象是否为指定类的对象不包括子类对象.
-
判断类是否为另外1个类的子类.
最后一个方法的使用如下所示:
11. 构造方法
1.之前给对象进行初始化时都是使用new,本质上new这个类方法等价于alloc这个类方法+init这个对象方法。
2.init方法又称为构造方法,它的作用如下:
3.如果想要自定义类的初始化属性值,那么需要重写init方法,注意init方法的重写规范如下:
重写实例如下:
关于init方法的两个详细解答
4.如果想要在init初始化时可以人为地对属性进行初始化,那么需要满足以下规范:
举例如下所示:
参考B站视频:Objective-C学习