欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > > 内容正文

详解Objective-C的优点和不足,详解objective-c

来源: 开发者 投稿于  被查看 11128 次 评论:11

详解Objective-C的优点和不足,详解objective-c


【优点】

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  。欢迎大家访问!

相关文章

    暂无相关文章

用户评论