【OC语言】第四篇·类的继承、多态、类对象以及SEL类型
来源:互联网 发布:恒生指数期货模拟软件 编辑:程序博客网 时间:2024/06/12 01:50
1. OC中两个保留字self和super,用于在方法定义中引用该方法的对象。
2. super发送消息可以将方法实现分发其父类,可以重写一个已有的方法来修饰或将它添加到现有的方法中,仍然可以将原始的方法纳入到修改后的方法中。
3. self的应用场景:
1)用在类方法中:指代当前类(可以用 [对象名 class] 输出当前类地址)
2)用在对象方法中:指代的是调用当前方法的对象。
3)访问成员变量。
4)self在OC的内存管理特殊使用。
4. self在对象方法中,可以利用self ->属性名称的方式访问成员变量。
应用场景:当存在局部变量名和成员变量名相同的时候。
注意:如果成员变量名和方法形参名同名,则局部变量会屏蔽成员变量的作用域。
二、类的继承和派生
1. 子类(派生类)获得父类(基类)的特性就是继承。
2. 基类和派生类的关系
派生类方法属性 = 基类方法属性 + 派生类自己新增的方法和属性
1)基类的私有属性能被继承,不能被使用。
2)OC中的继承是单继承:也就是说一个类只能有一个父类,不能继承多个父类。
3)继承的合理性
4. 重写:把父类的方法,在子类的@implementation中重新给实现
5. 继承的注意事项:
1)子类不能定义和父类同名的成员变量。
2)OC支持单一继承,不支持多继承
3)OC支持多层继承。
三、实例变量修饰符
1. @public:公开的,在任何地方通过实例对象都可以访问
2. @private:私有的,表示只能在当前类中使用
3. @protected:受保护的,表示只能在当前类和子类当中使用
4. @private 修饰的成员变量可以被子类继承,但是不能被子类访问。
5. 实例变量默认是protected类型。
6. 在类的实现即.m文件中也是可以声明成员变量,但是因为在其它文件中,通常都只是包含头文件而不会包含实现文件,所以在.m文件中声明的成员变量都是@private的。
四、description
1. 当我们以%@的格式,输出对象时,此时调用了对象的description方法,对象中如果没有重写父类的description方法,则调用父类。
2. 对象的description方法
-(NSString *)description{
return [NSString stringWithFormat:@"成员变量信息",成员变量列表];
}
3. 类的description方法
+(NSString *)description{
return @"+开头的方法";
}
4.description陷阱
千万不要再description方法中同时使用%@ 和self。如果同时使用,代表了要调用self的description方法,因此会导致程序陷入死循环。
五、多态
1. 程序中的多态:不同的对象以自己的方式响应相同名称方法的能力称为多态。
2. 多态的条件:有继承关系、有方法的重写,父类的声明变量指向子类对象。即:用父类类型的指针指向了子类对象。
3. 多态的优点:
多态的主要好处就是简化了编程接口。它容许在类和类之间重用一些习惯性的命名,而不用为每一个新加的函数命名一个新名字。这样,编程接口就是一些抽象的行为集合,从而实现接口的类的区分开来。
4. 多态原理
1)动态绑定:动态类型能够使程序直到执行时才确定对象所属类型。
动态类型绑定能使 程序知道执行时才确定要对对象调用的实际方法
OC不同于传统程序设计语言,它可以再运行时加入新的数据类型和新的程序模块:动态类型识别,动态绑定,动态加载
id类型:通用指针类型,弱类型,编译时不进行类型检查
5.注意:
1)如果存在多态,父类是可以访问子类特有的方法。
例如:Animal *a = [Dog new]; [(Dog *) a bark] ; //把父类的指针强制类型转换
2)如果不存在多态,父类是不可以访问子类特有的方法。
例如:Animal *a2 = [Animal new]; [(Dog *) a2 bark]; //错误
六、类的本质
1. 类的本质其实也是一个对象(类对象)。
2. 类对象:
类对象在程序运行是一直存在
类对象是一种数据结构,存储类的基本信息:类大小,类名称,类的版本以及消息与函数的映射表等。
类对象所保存的信息在程序编译时确定,在第一次使用该类的时候被加载到内存中。
类对象代表类,class代表类对象,类方法属于类对象
如果消息的接受者是类名,则类名代表类对象
运行时,所有类的实例都由类对象生成,类对象会把实例的isa的值修改成自己的地址,每个实例的isa都指向该实例的类对象
从类对象那里可以知道父类信息,可以响应方法
类对象只能使用类方法,不能要实例方法
3. 类对象的获取
Dog *dog = [Dog new];
通过对象来获取:Class c = [dog class];
通过类名来获取: Class c1 = [Dog class];
七、SEL类型
1. SEL:全称selector表示方法的存储位置
2. Person *p = [[Person alloc] init];
[p test];
寻找方法的过程:
1)首先把test这个方法名包装成SEL类型数据
2)根据SEL数据找到对应的方法地址
3)根据方法地址调用相应的方法
4)在这个操作过程中有缓存,第一次找的时候是一个一个的找,非常耗性能,之后再用到的时候就直接使用。
3. SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去寻找对应的方法地址,找到方法地址后,可以调用方法。这些都是运行时特性,发消息就是发送SEL,然后根据SEL找到地址,调用方法。
八、类对象的存储细节
0 0
- 【OC语言】第四篇·类的继承、多态、类对象以及SEL类型
- OC基础day4-继承,self,super,多态,类对象,SEL类型,description,私有方法与私有变量,三种访问限制
- OC语言--SEL类型小记
- 黑马程序员IOS-OC语言-类的本质、SEL
- 黑马程序员——OC语言------OC特有语法:分类、description、类对象、SEL
- OC - SEL类型的使用
- 【OC语言】第二篇·对象的作用、字符串类型以及多文件开发
- OC语言的第四天 static、self、super、继承、NSObject类、私有属性和私有方法、多态
- 黑马程序员——OC基础语法—类的本质和SEL类型
- OC-SEL类型
- OC-033.SEL类型
- OC语言--SEL
- 黑马程序员-OC语言-SEL类型(听课笔记)
- OC语言学习 (四) SEL对象,用于日志输出的宏
- OC关键字@property、@synthesize和id类型、构造方法、分类categary、类的本质、description方法、SEL消息机制
- OC基础-类的本质+description+SEL
- oc中类的深入研究、description、sel
- OC中SEL,类别,继承,协议的使用
- 【C语言】第十篇·文件操作
- C语言通讯录
- 【OC语言】第一篇·Objective-C概述和面向对象
- 【OC语言】第二篇·对象的作用、字符串类型以及多文件开发
- 【OC语言】第三篇·类方法的使用、匿名类以及封装
- 【OC语言】第四篇·类的继承、多态、类对象以及SEL类型
- 【OC语言】第五篇·@property和@synthesize关键字、动态类型检测和构造方法
- web_custom_request应用示例-飞机订票系统中的删票操作
- 【OC语言】第六篇·内存管理
- 【OC语言】第七篇·ARC和分类
- 【OC语言】第八天·block和Protocol
- 【OC语言】第九篇·NSString,NSArry,NSDictionary
- 【OC语言】第十篇·NSFileManager、NSDate、沙盒、copy以及单例模式
- 【OC笔记】关于MRC中的注意问题