【优点】
1.Category类别
2.Posing
3.动态识别
4.指标计算
5.弹性消息机制
6.不是一个太复杂的C衍生语言
7.OC可以和C、C++、Swift混合编程
【缺点】
1.不支持命名空间
2.不支持运算符重载
3.不支持多重继承
4.使用动态运行时类型,所有的方法都是函数调用,很多编译时的优化方法都用不到,如内联函数。
【详解】
【1】.category类别:
Category依赖于类,它可以在不改变原有类的基础上,为类增加一些方法。在和别人进行合作的时候,就不用担心合并冲突的问题。category的使用需要注意如下:
1)分类只能增加方法,不能增加成员变量;
2)在分类方法中可以访问原来类中的成员变量;
3)分类中可以重写原来方法中的实现,但是会覆盖原来的方法,导致原来的方法不可用;
4)分类调用的优先级:分类>原来的类>父类。若包含多个分类,则最后编译的分类优先。
我通过一个简单的代码来演示一下:
Person.h实现如下:
#import
@interface Person : NSObject
- (void) show;
@end
#import "Person.h"
@implementation Person
- (void) show{
NSLog(@"Person");
}
@end
#import "Person+YY.h"
@implementation Person (YY)
- (void) show{
NSLog(@"这是一个Category");
}
@end
可以看到,执行的show方法并不是调用Person中的show方法,而是调用person的分类Person+YY中重写的show方法,也就是说,分类扩展了原有类的功能。但是同时也会覆盖原有的方法,导致原有的方法不可用。
现在修改部分代码如下:
Person.h
#import
@interface Person : NSObject
@property(nonatomic,strong) NSString* number;
- (void) show;
@end
#import "Person+YY.h"
@implementation Person (YY)
- (void) show{
NSLog(@"这是一个Category");
self.number = @"afasefs";
NSLog(@"%@",self.number);
}
@end
可以看到,在分类中是可以访问到原来类中的成员变量的,直接使用self.***就可以访问。当然,这个属性应该是定义在头文件中,否则就不能访问。
学习到这里,你可能会觉得分类和继承有点类似,其实还是有差别的。继承的耦合度比分类要高。比如我们要为NSString增加一个方法,这时使用分类就很方便。由于OC是running language,我们可以使用OC的动态运行分配机制,使用分类为NSString添加新的方法。
现在我们来谈谈分类有哪些优点:
优点1:对一个类的实现代码分散到不同的文件或者框架中;
优点2:创建对私有方法的前向引用;
优点3:向对象添加非正式协议;
分类的缺点:
缺点1:分类有相隔局限性;
缺点2:无法向分类中增加实例变量,分类没有空间来容纳实例变量;
缺点3:名称冲突,具有更高优先级的方法将导致现有方法不可用;
【2】.Posing
Posing的意思是扮演,冒充。Posing存在的目的在于子类可以冒充父类,可以让父类表现为子类的行为。这里主要使用到的方法就是poseAsClass方法,不过貌似这个方法现在已经被禁用了。
【3】.动态识别
首先这里涉及到多态的概念。主要就是把对象的类型确定从编译时推迟到了运行时,以及再去确定调用的方法。和C语言是静态语言不同,C语言要求在编译时就确定对象的类型。C语言是静态语言,是强类型语言;OC是动态语言,是弱类型语言。主要记住,OC是一门运行时语言。所以运行时是多态的基础。
此时,我们也可以联想到iOS开发中的情况——动态加载。我们在项目中放有@1x,@2x,@3x三种类型的图片,只有当设备改变时,这些图片根据屏幕的分辨率就能动态加载。当然,这个并不是OC的特性。
////////////////////////////////////////////////////////////////////////////////////////
【4】OC 不支持命名空间
OC 中没有命名空间的概念,也没有包的概念,为了区分不同的类,可以在类名前加前缀。OC中的关键字都是以@开头,用来区分C和C++的关键字,最显著的就是字符串前面的@。
【5】OC不支持多重继承
在OC中使用实现多个protocol来替代多重继承,protocol就类似接口的概念。
github主页:https://github.com/chenyufeng1991 。欢迎大家访问!