您的位置:首页 > 移动开发 > IOS开发

iOS中协议和延展的区别

2015-12-27 22:33 519 查看
延展部分

一、延展的介绍

延展也叫Extension,形式和类目相同,是一种特殊形式的类目(匿名类目),主要是为现有类添加私有方法,可以通过建立文件创建延展,也可以直接在现有类的.m中声明延展。

延展的声明形式:

@interface 现有类名 ()

//这里可以声明方法

@end

二、延展的特点(注意事项)

1、如果括号里没有类目名,则认为延展里面的方法为全都必须实现,如果有名,则认为是可选实现。

2、虽然延展是给一个类定义私有方法,但是OC里面没有绝对的私有方法(可以被外部和子类强制调用的,当然也可以被子类继承,只是子类没有调用接口所以要强制调用),另外延展里面声明的变量只能在该类内部使用,外界访问不了。

3、如果是通过创建文件建立的延展,.h文件不能加实例变量,只能添加方法。

三、举一个延展的例子

建立延展有两种方式,第一种,直接在现有类的.m中声明一个延展(其实这种方法可以省略声明,没有在现有类.h中声明的现有类方法都相当于是延展方法),比较简单,不再做详细的介绍;第二种是通过创建文件来建立延展,建立流程

new file->Source->Objective-C File->next

File Type 可以选取类目延展或者协议 File处填写延展名字,我们这里就填写一个“Extension”

下面通过代码举一个例子来看看

首先建一个项目,主页面MainViewController,建立一个现有类MyClass并为现有类建立一个延展(通过建立文件,只有一个.h文件)MyClass_Extension,下面来看具体代码:

在MyClass_Extension.h中

//这里是MyClass.h
#import "MyClass.h"
@interface MyClass ()
//这里可以声明方法,但是不可以声明成员变量
-(void)method1;
@end


MyClass.h中

#import <Foundation/Foundation.h>
@interface MyClass : NSObject
//这里声明的方法和成员变量可以被外界调用也可以被子类继承
-(void)method;
@end


MyClass.m中

#import "MyClass.h"
@interface MyClass ()//延展
{
int a;
}//这里声明的成员变量和方法为私有,但是方法可以被外界和子类强制调用,也可以被子类继承
-(void)method2;
@end

@implementation MyClass
-(void)method
{
NSLog(@"method");
}
//在这里对延展方法1进行实现
-(void)method1
{
NSLog(@"method1");
}
//有声明的完全私有方法,可以强制调用,但是会警告
-(void)method2
{
NSLog(@"method2");
}
//没有声明,与上面一样,可以强制调用,但是会有警告
-(void)method3
{
NSLog(@"method3");
}
@end


在MainViewController是这样调用的

#import <Foundation/Foundation.h>
#import "MyClass.h"
#import "MyClass_Extension.h"//导入文件延展(调用延展方法声明)


MyClass *m=[[MyClass alloc]init];
[m method];
[m method1];//调用延展方法(只要导入头文件)
//下面两个方法为私有,但是也可以这样强制调用,在子类中也可以
[m method2];
[m method3];


总而言之,现在延展用处并不大了,也许后面再用到延展的时候是很少的了,所以只是简单介绍一下。

协议部分

一、协议的介绍

协议的声明结构

@protocol MyProtocol <NSObject>//可以继承其它的协议

//这里写方法声明

@end

协议不是类,只是一个其他对象可以实现的接口,声明了可以被其他的类实现的方法。

二、协议的作用与特点

1.在OC中是没有多继承的概念的,我们可以用协议来实现类似多继承的模式(实现类之间的通讯);

2.和其他高级语言中接口不同的是协议中定义的方法不一定是必须实现的,我们可以通过关键字进行@required和@optional进行设置,如果不设置则默认是@required(注意ObjC是弱语法,即使不实现必选方法编译运行也不会报错);

3.协议的实现只能在类的声明上,不能放到类的实现上(也就是说必须写成@interface Person:NSObject<AnimalDelegate>而不能写成@implementation Person<AnimalDelegate>);

4.协议中不能定义属性、成员变量等,只能定义方法;

5.协议只负责声明方法,方法的实现是在遵循协议的类中代为实现的;

6.在想要调用协议方法的类里面声明一个id类型的遵循协议的属性或者成员变量,想办法让这个属性或者成员变量的值=某一个遵循协议并实现了协议方法的类所实例化的对象,之后就可以通过这个属性活成员变量来调用协议里面的方法;

7.一个协议可以被多个类遵循实现,当然一个类也可以遵循实现多个协议里的方法;

8.协议可以自己新建一个文件,也可以直接声明在想要调用协议方法的类的.h文件中。

三、一个协议使用的例子

首先,我们建一个项目,一个主页MainViewController,一个遵循协议实现协议方法的类MyClass,一个声明属性调用协议方法的类diaoYong,以及一个协议文件MyProtocol,(协议文件建立方法new
file->Source->Objective-C File->next =>File Type 可以选取类目延展或者协议 File处填写协议名字,我们这里就填写一个“MyProtocol”)

接下来看代码:MyProtocol.h中

#import <Foundation/Foundation.h>
@protocol MyProtocol <NSObject>
-(int )addx:(int)x andy:(int)y;//默认为必须实现方法
//@optional//关键字为可选实现方法
//-(void)method1;
//@required//关键字必须实现方法
//-(void)method2;
@end


实现协议的类MyClass.h

#import <Foundation/Foundation.h>
#import "MyProtocol.h"//导入头文件
//尖括号内是对协议的遵循
@interface MyClass : NSObject<MyProtocol>
@end
MyClass.m中

#import "MyClass.h"
@implementation MyClass
//实现协议中的方法
-(int )addx:(int)x andy:(int)y
{
return x+y;
}
@end


通过属性调用协议方法的类diaoYong.h

#import <Foundation/Foundation.h>
#import "MyProtocol.h"
@interface diaoYong : NSObject
//遵循协议的属性,用来调用协议的方法
@property (strong,nonatomic) id<MyProtocol> delegate;
-(void)methodAddX:(int)x andY:(int)y;//自己的方法
@end
diaoYong.m中

#import "diaoYong.h"
@implementation diaoYong
-(void)methodAddX:(int)x andY:(int)y
{
//用遵循协议的属性调用协议方法
NSLog(@"%d",[self.delegate addx:x andy:y]);
}
@end


最后在主页中调用的代码

#import <Foundation/Foundation.h>
#import "diaoYong.h"
#import "MyClass.h"


diaoYong *dy=[diaoYong new];
MyClass *mc=[MyClass new];
dy.delegate=mc;//将遵循协议的属性与实现协议的类对象关联起来,很重要
[dy methodAddX:10 andY:10];


输出结果:[1663:89363] 20 至此一个协议的最基本的用法介绍完成

备注:其实协议最重要的一个用途就是实现iOS中常用的一种代理(委托)设计模式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: