oc中的工厂设计模式

来源:互联网 发布:薪酬数据分析及统计表 编辑:程序博客网 时间:2024/05/07 12:24
OC中的工厂设计模式

拿NSString类为例,NSString类中本身定义的方法只有两三个(length等),但是为什么我们使用NSString对象的时候能调用如此多的方法?
这里就要引入分类的概念,我们随便调用一个NSString类方法,command进入其定义文件查看,发现这个方法会位于类似
@interface NSString (NSStringExtensionMethods)
这样的分类中

什么是工厂设计模式?
工厂设计模式就是调用一个方法,这个方法能够返回一个A类对象,那么这个方法就成为A类的工厂,(工厂的功能是制造,这里的工厂功能是制造对象),我个人称之为工厂方法
一句话,工厂方法就是能创建对象、返回对象的方法

而NSString的所有对象创建方法(工厂)都是用分类实现的

所以我们可以把创建一个新的NSString的过程总结如下:
NSString *str =[[NSString alloc]init]
第一步
在堆中申请一个NSString对象 [NSSString alloc](这个对象是一个中间对象)
第二步
这个对象调用init系列函数,init系列函数就是工厂,在init系列函数中创建新的对象
第三步
定义一个强指针指向工厂创建出来的这个对象

实例证明:

        NSString *h = [NSString alloc];

        NSLog(@"%p", h);

        NSString *g = [h init];

        NSLog(@"%p", g);


打印结果

2015-08-07 15:13:00.794 ZCMyDict[1946:113735] 0x1001002c0

2015-08-07 15:13:00.796 ZCMyDict[1946:113735] 0x7fff71c25b90

[注意]

基类的方法本身就是一个工厂设计模式,也就是说工厂设计模式是贯穿OC语言始终的


NSString的类簇解释:

问: 

 NSString的子类为什么不能使用NSString中分类的方法?

答:

 NSStrting的所有构造函数工厂方法中,使用的中间对象可能不是NSString本类对象,而是NSString类的子类对象,返回的夜也是NSString类的子类对象,然后被多态的返回值给接收到,所以如果是这样实现的话,那么在外面如果实现一个NSSString类的子类,去调用这个工厂方法,就会出现我们创建的子类对象 调用工厂创建出来的子类对象的方法,子类调用子类,这种操作是非法的操作,编译能通过,但是运行时就会出错。


oc中的数组,可变数组,字符串,可变字符串,字典,可变字典等等,它们的所有返回对象的方法都是工厂方法,所以一定有新的指针接收返回值(特别对于可变数据类型来说,可变数据类型实际上没有实现在自己内部可变,而是借助不断申请新的内存代替self实现表面上看起来的可变功能



[关于构造函数的思考]
所以这就解释了为什么alloc出来的指针是中间指针,而最后返回的指针是init前缀的构造方法产生的指针
因为init前缀的构造方法都是工厂方法,工厂方法里肯定会执行三步操作
第一步:释放self(释放调用此init工厂方法的本对象)
第二步:创建新对象(创建一个新的对象接收传入的初始化值)
第三步:对接收完的新对象进行autorelease操作
第四步:返回新对象给一个强指针





0 0