动态机制、类别、协议、复制知识点总结

来源:互联网 发布:上日本女人的体验知乎 编辑:程序博客网 时间:2024/04/27 18:56

1、动态机制

特点:

克服在源代码编译和链接的时候必须决定内存大小和地址。

让程序根据用户运行程序的环境来决定行为。

表现形式:

动态类型识别,直到运行时才决定一个对象的类别”。

动态绑定,直到运行才决定调用哪个方法。

动态加载,运行时加入新的模块。

2、一些类的方法

-(BOOL)isKindOfClass:class-object 对象是否为类或其子类的成员

-(BOOL)isMemberOfClass:class-object  类是否有对象

+(BOOL)isSubclassOfClass:class-object  类是指定类的子类

-(BOOL)respondsToSeletor:selector:selector 对象是否能响应selector方法

-(BOOL)instancesRespondToSelector:selector  类是否能响应selector方法

-(id)performSelector:selector withobject:object  应用selector指定的方法

-(id)performSelector :selector  应用selector指定的方法

-(id)performSelector:(SEL)aSelector withObject:(id)anObject withObject:(id)anotherObject   传递参数object

[Square class];//通过类名声明

[mySquare class];//通过对象名声明

判断两个对象是否在一个类

if([obj1 class] == [obj2 class])

3、类别category

类别的特点:

将方法的实现分解成一系列分离的文件。

类别的方法,在运行时加入类中。

类别常用方式:

   分解大的代码

       每个类别实现一类方法。

   给已有的类添加新方法

       不修改原有类的情况下,可以给该类添加新方法

       注意:类别会替代原有类中的方法。

4使用类别步骤

先声明类别-->实现类别-->使用类别

注意:类名的命名规范:类名+扩展方法。

在类别中,只能添加新的方法。

不能添加新变量。

5、类别的局限

名称冲突:

1)类别中的方法,不能与原类中已有的方法重名。

2)如果发生名称冲突,类别具有更高的优先级。

3)类别中的方法,将取代原有类中的同名方法,从而无法再使用原有方法。

4)解决名称冲突:

可以在自己的类别方法名字前,增加一个前缀,以确保不发生名称冲突。

6、类别的作用

将类的实现分散到多个不同文件或多个不同框架中。

创建对私有方法的前向引用。

添加非正式协议,即给类添加新的功能函数。

7、非正式协议与委托类别

(1)协议

是一个方法列表,可以由多个类共享。

它声明了一系列的方法而不进行实现。

*作用:

使一个类可以正式地声明一个方法列表

作为向外提供服务的接口

(2)非正式协议

列表中的方法是可以选择性实现的。

用于将方法归类,更好地组织代码。

(3)正式协议是通过protocol指定的一些列方法的声明,然后由实现该协议的类自己去实现这些方法。而非正式协议是通过向NSObject中添加一个类别来实现,然后子类去继承NSObject。

(4)注意:

一个类可以采纳多个协议

不同的协议之间用逗号分隔

8、延展类别又称为扩展(Extendsion)

Extension是Category的一个特例。

其名字为匿名(为空),并且新添加的方法一定要予以实现。(Category没有这个限制)。

9、正式协议中的泛型

 -(void) test:(id<IQuery>) obj; 这表明test方法接受一个任意类型的对象做为参数,但是该参数对象必须实现接口IQuery(也可以说成该参数对象必须采用正式协议IQuery)。

10、代理(委托)设计模式

代理是指一个对象提供机会对另一个对象中的行为发生变化时做出的反应。

@optional:该指令后的方法都是可选的,即不一定要实现.

@required关键字:该指令后面的方法,必须要实现.

11、对象复制

(1)复制对象顾名思义,复制一个对象作为副本,它会开辟一块新的内存(堆内存)来存储副本对象,就像复制文件一样。即源对象和副本对象是两块不同的内存区域.

<NSCopying>协议

<NSMutableCopying>协议

(2)常用的可复制对象有:NSNumber、NSString、NSArray、NSDictionary等

(3)复制对象的种类

copy:产生对象的副本是不可变的

mutableCopy:产生的对象副本是可变的

12、浅拷贝和深拷贝

浅复制只复制对象的本身,对象里的属性、包含的对象不做复制。

深复制则即复制对象本身,对象的属性也会复制一份。

Foundation框架中支持复制的类,默认是浅复制。

(1)浅层复制(Shallow Copy)

浅拷贝。

该操作不会复制对象。

浅拷贝后,新对象,只是指向原有对象的一个引用。

(2)深层复制 (Deep Copy) 

深拷贝。

是一种会重新分配内存地址的拷贝方式。

利用深拷贝,将会复制产生一个新的对象。

13、copy、mutableCopy和retaion之间的关系

(1)Foundation可复制的对象,当我们copy的是一个不可变的对象是,他的作用相当于retaion。

(2)我们使用mutableCopy时,无论源对象是否可变,副本是可变的。

并且实现了真正意义上的拷贝。

(3)当我们copy的是一个可变的对象时,副本对象是不可变的,同样实现了真正意义上的拷贝。

14、内存管理的原则

如果使用alloc、copy或者new方法获得一个对象

那么该对象的保留计数器的值为1。

而且要负责释放该对象。

15、单例模式

(1)单例设计模式运用较为普遍、广泛且较为简单的设计模式之一,它的设计原理是始终返回一个实例,即一个类始终只有一个实例。

(2)创建单利设计模式的基本步骤:

1)声明一个单件的静态实例,并初始化为nil;

2)创建一个类的类工厂方法,生成一个该类的实例,并且仅当这个类的实例为nil时;

3)覆盖allocWithZone:方法,确保用户在直接分配和初始化对象时,不会产生另一个对象。

4)实现NSCopying协议,覆盖releas、autorelease、retain、retainCount方法,以确保单例的状态

5)在多线程的环境中,注意使用@synchronized关键字,确保静态实例被正确创建和初始化。