Objective-C学习笔记(4)——特有语法

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学习

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值