本帖最后由 杨光0618 于 2016-8-22 18:53 编辑
Mark 01 NSObject类
1.NSObject是Foundation框架中的一个类
- 在这个类中有一个new方法
- 作用:创建一个对象,并初始化对象,将这个对象的地址返回
- 创建的类必须直接的或间接的从NSObject父类继承
2.super关键字
- 在对象方法中使用super
- 如果调用的方法真的是从父类继承而来,建议是用super,代码可读性更高
- 类方法中也可以使用super
3.类方法能否被继承
- 类方法可以被继承,通过子类可以调用
- 在内存中只有一份
- 使用super显式的从父类继承过来的类方法
- 调用类方法
- 使用父类名
- 使用子类名
- 使用self来调用
- 使用super也可以调用
- super关键字在对象方法中显式的调用从父类继承过来的对象方法,在类方法中
4.访问修饰符
- @pravite
- 私有属性,只能在本类中访问,除了这个类的内部,其它地方都是无权访问的
- 父类的私有成员,子类也是可以继承的,只不过在子类中无法继承私有成员
- @protected
- 受保护的,被@protected修饰的属性,只能在本类和子类中访问
- @package
- 被@package修饰的属性,只能在当前这个target访问
- @public
- 公共属性,被@public修饰的属性,可以任意访问
- 如果没有属性加修饰符,默认为@protected属性
- 修饰符的作用域
- 从访问修饰符开始,到下一个访问修饰符或者遇到大括号,结束
5.私有属性和私有方法的应用
- 类的属性还可以定义在@implementation中,任何访问修饰符无效,都是私有的
- 定义在@implementation中和定义在@interface中的唯一区别是,Xcode不提示
- 使用建议
- 写类,一般有两种属性
- 一种是在.h中用protected修饰的
- 一种是在.m中的真私有属性
- OC中没有真正的私有
6.私有方法
- 访问修饰符只能修饰属性,不能修饰方法
- 私有方法的办法是只写实现,不写声明
Mark 02 里氏替换 LSP
1.子类对象可以替换父类对象的位置,并且程序的功能不受影响
- 里氏替换的优点
- 一个指针不仅仅可以存储本类对象的地址,还可以存储子类对象的地址
- 如果一个指针的类型,是NSObject类型,那么这个指针当中可以存储任意OC对象的地址
- NSObject类型的指针也叫万能指针
- 如果一个数组的元素的类型是一个父类型指针,那么这个数组中既可以存储本类对象,也可以存储子类对象
- 如果一个数组元素的类型是NSObject类型的,那么这个指针可以存储任意类型的OC对象
- 局限性
- 当一个父类指针指向一个子类对象的时候,只能通过这个父类指针去访问这个子类对象的父类成员,子类独有的属性不能访问
Mark 03 方法重写
1.子类有这个方法,但是子类和这个方法的实现不一样
2.子类认为父类的方法做的事情还不够,想要在父类方法的基础之上,在多做一些事情
- 需要使用super关键字来调用父类的方法,然后添加自己的实现[super 父类方法];
在.m文件中,重新实现要重写的方法,不是声明,也不需要再次声明
如果一个父类指针,指向的是子类的方法,那么通过这个父类指针,调用子类方法的时候,调用的是子类修改后的方法
Mark 04 多态
1.同一种行为,对于不同的事物而言,具有完全不同的表现形式
2.多态是个现象
Mark 05
1.NSLog打印一个对象的时候
- 可以使用%p,也可以使用%@
- %p打印的是指针变量的值,也就是对象的地址
- %@打印的是指针指向的对象
- %@打印的原理
- 先调用传入的对象的description方法,这个方法有一个返回值,是NSString字符串
- 拿到这个方法返回的字符串数据,将这个字符串输出在控制台
- description方法是定义在NSObject类的一个方法,所以这个方法所有的对象都有
- 如果你想自定义打印对象的格式,那么只需要重写Description方法的实现即可
Mark 06 特有语法
1.子类对象有子类和它所属的父类的所有属性
- 子类创建对象的时候,会在堆区中申请空间,只会申请属性所占的空间
- 子类调用方法时,方法的查找顺序
- 首先会在本类中寻找,如果有直接调用,如果没有会向直接父类中寻找,如果有会调用,如果没有会继续寻找,知道NSObject这个类,如果依旧没有,报错!
2.关于类加载
- 类何时加载
- 类以什么形式存储到代码区
- 任何存储在内存中的数据都有类型
- 加载类到代码段中的过程
- 现在代码段中创建一个Class类型的对象
- Class类是一个对象,是系统定义的
- Class对象用来存储类的信息
- 类是以Class对象的形式存储在代码段中
- 何时回收存储在代码区中的类
3.SEL数据
- SEL是一个变量,这个变量可以存储一个方法
- SEL 别名;
- 别名 = @selector(方法名);
- 通过SEL包装的的方法,即使是私有的方法,也可以调用
|
|