详解Objective-C的优点和不足
2015-10-13 14:51
591 查看
【优点】
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实现如下:
Person.m实现如下:
Person+YY.m实现如下:注意YY是Person的一个Category。
运行结果如下:
。
可以看到,执行的show方法并不是调用Person中的show方法,而是调用person的分类Person+YY中重写的show方法,也就是说,分类扩展了原有类的功能。但是同时也会覆盖原有的方法,导致原有的方法不可用。
现在修改部分代码如下:
Person.h
Person.h+YY.m
运行结果如下:
。
可以看到,在分类中是可以访问到原来类中的成员变量的,直接使用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 。欢迎大家访问!
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 <Foundation/Foundation.h> @interface Person : NSObject - (void) show; @end
Person.m实现如下:
#import "Person.h" @implementation Person - (void) show{ NSLog(@"Person"); } @end
Person+YY.m实现如下:注意YY是Person的一个Category。
#import "Person+YY.h" @implementation Person (YY) - (void) show{ NSLog(@"这是一个Category"); } @end
运行结果如下:
。
可以看到,执行的show方法并不是调用Person中的show方法,而是调用person的分类Person+YY中重写的show方法,也就是说,分类扩展了原有类的功能。但是同时也会覆盖原有的方法,导致原有的方法不可用。
现在修改部分代码如下:
Person.h
#import <Foundation/Foundation.h> @interface Person : NSObject @property(nonatomic,strong) NSString* number; - (void) show; @end
Person.h+YY.m
#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 。欢迎大家访问!
相关文章推荐
- 接口测试之JsonObject
- objective-c制作QQ登录界面
- Object C Dictionary字典
- Object-C宏定义与const变量
- java.lang.UnsupportedClassVersionError: org/json/JSONObject : Unsupported major.minor version 52.0
- java.lang.UnsupportedClassVersionError: org/json/JSONObject : Unsupported major.minor version 52.0
- Foundation Kit框架概叙
- JSON解析 Gson解析方式 JSONObject JSONArray
- Objective-C编程语言概叙
- qt QMetaObject::connectSlotsByName()自动关联失效问题解决
- 最长公共子字符串查找(OC实现)
- Objective-C自动释放池AutoreleasePool详解
- Objective-C中NSArray和NSMutableArray的基本用法
- boost pool 和 object_pool
- Objective—C语言的新魅力——Nullability、泛型集合与类型延拓
- 深入理解 Objective-C:方法缓存
- SecurityContextHolder, SecurityContext and Authentication Objects
- iOS程序崩溃,提示[__NSCFArray removeObjectAtIndex:]: mutating method sent to immutable object’的解决办法
- Objective-C 对字符串的操作
- Objective-C 数组