OC-3-面向对象

self和super关键字

OC中提供了两个保留字self和super,用于在方法定义引用执行该方法的对象。OC语言的self相当于其他语言的this指针。
self的应用场景:1、用在类方法:self指代的是当前类([对象 class]:返回的就是当前类,类对象)
                         2、用在对象方法:self指代的是调用当前方法的那个对象
                         3、访问成员变量:加self访问实例变量,不加是局部变量
                         4、self在OC的内存管理特殊使用
super的使用:子类调用父类方法:[super 父类方法名],super指代的是父类对象


类的继承和派生概念
基类:被继承或可以派生的类
派生类:不仅拥有基类的属性和方法,还可以创建自己的属性和方法

注意:1、基类的私有属性能被继承,不恩能够访问
     2、OC中是单继承,一个类只能有一个父类,不能继承多个父类
     3、继承的合理性(人是人他妈生的,妖是妖他妈生的

方法的重写:声明部分@interface不用管,直接在@implementation重新实现

实例变量修饰符-作用域
访问修饰符
1、@public:任意程序集
2、@protected:同一个类或者派生类(默认),当前类或子类
3、@private:同一个类,当前类
4、@package:框架级别,作用域在共有和私有之间,一般不用

变量修饰符对子类的影响
1、@public,在子类可以正常访问和使用
2、@protected,可以访问和使用
3、@private,能继承,不能访问

注意事项
1、默认@protected
2、 子类可以继承父类所有的实例变量和方法,但是不是所有的都可以访问

OC中的私有变量
在.h中没有声明, 在类的.m实现文件中,定义的实例变量,是纯私有的,只能在当前类使用
OC中的私有方法(隐藏了,只能在当前类
在.h中没有声明,在.m中实现的方法,不能被子类继承和访问,可以在实现文件.m中通过self访问私有方法


description方法介绍及重写

当我们以%@的格式,打印了对象,此时调用了对象的description方法,对象中如果没有重写父类的description方法,则调用父类的。

description方法中不能够同时使用%@和self

多态的概念和条件
1、什么是多态?
多态:就是某一类事物的多种形态
程序中的多态:不同的对象以自己的方式响应相同名称方法的能力称为多态

2、多态的条件:有继承关系、有方法重写、父类的声明变量指向子类对象
//代码体现:用父类类型的指针指向了子类对象,这就是多态
狗   *G = [狗 new]
动物 *A = [狗 new] ——这就是多态

3、多态的优点
多态的主要好处就是简化了编程接口,它容许类与类之间重用一些习惯性地命名
多态也使得代码可以分散在不同的对象中而不用试图在一个函数中考虑到所有可能的对象

4、多态的实现
// 正常的调用,没有使用多态
       
Animal *ani = [ Animal new ];
        [ani
run ];
       
       
Dog *d1 = [ Dog new ];
        [d1
run ];
       
       
Cat *c1 = [ Cat new ];
        [c1
run ];
       
       
// 使用多态,父类指针指向了子类对象
       
Animal *d2 = [ Dog new ];
        [d2
run ];
       
       
Animal *c2 = [ Cat new ];
        [c2 run];

                     // 父父类指针指向子类对象
       
Animal *d3 = [ YellowDog new ];
        [d3 run];

5、多态的原理
          1)动态绑定:动态类型能使程序直到执行是才确定对象所属类型
          2)动态类型绑定能使程序直到执行时才确定要对对象调用的实际方法
          3)OC不同于传统程序设计语言,他可以在运行时加入新的数据类型和新的程序模块:动态类型识别、动态绑定、动态加载
          4)id类型:通用指针类型,弱类型,编译时不进行类型检查

6、多态的注意点
          1)如果存在多态,父类可以访问子类特有的方法

        Animal *d4 = [ Dog new ];
       
//d4 Animal 类型     编译时会报错
       
//[d4 eat];
       
       
// d4 强制转换为 Dog * 类型 可以执行
        [(Dog *)d4 eat];
          2)如果不存在多态,父类是不可以访问子类特有的方法


类的本质
1、类类型的变量(实例对象)
2、类的本质
     类的本质其实也是一个对象(类对象)
     1)类对象在程序运行时一直存在
     2)类对象是一种数据结构
     3)类对象所保存的信息在程序编译时确定,在第一次使用该类的时候被加载到内存中
     4)类对象代表类,class代表类对象,类方法属于类对象
     5)如果消息的接收者是类名,则类名代表类对象
       6)类对象只能使用类方法,不能使用实例方法

Person *p = [Person new];
p  实例对象
Person 也是一个对象(类对象),是class类型

3、类对象如何获取
          1)通过实例对象获取
               Class c1 = [p class]
          2)通过类名来获取对象
               Class c2 = [Person class]
c1和c2地址一样,本质相同,都是Person
4、类对象的使用
     1)创建实例对象  [Person new]
     2)调用类方法
     3)使用类对象创建实例对象
                     Class c2 = [Person class];
                     Person *p = [c2 new];
          c2可以当Person来用
     4)使用类对象调用类方法
               c2来调用

类对象的存储细节

SEL类型
SEL:全称selector表示方法的存储位置

注意:SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去寻找对应的方法地址,找到方法地址后就可以调用方法。这些都是运行时特性,发消息就是发送SEL,然后根据SEL找到地址,调用方法。

  Person *p = [ Person new ];
       
//[p test];  自动包装
       
       
// 手动的把 test 方法包装成 SEL 类型
       
SEL s1 = @selector (test);
       
// 响应方法
        [p performSelector:s1];
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值