黑马程序员技术交流社区
标题:
OC基础第六天笔记
[打印本页]
作者:
杨光0618
时间:
2016-8-22 18:48
标题:
OC基础第六天笔记
本帖最后由 杨光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包装的的方法,即使是私有的方法,也可以调用
[对象 performSeletor:对象名];
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2