iOS Protocol 详解
一、概述
Protocol(協議)的聲明看起來類似一個類的接口,不同的是Protocol沒有父類也不能定義實例變量。Protocol是一種特殊的程序設計結構,用于聲明專門被別的類實現的方法。因為OC是單繼承的,由于不支持多繼承,所以很多時候都是用Protocol和Category來代替實現多繼承。Protocol只能定義公用的一套接口,但不能提供具體的實現方法。也就是說,它只告訴你要做什么,但具體怎么做,它不關心。
Protocol的基本用途:
(1)可以用來聲明一大堆方法(不能聲明成員變量)
(2)只要某個類遵守了這個協議,就相當于擁有這個協議中的所有方法聲明
(3)只要父類遵守了某個協議,就相當于子類也遵守了
(4)和java中的接口很相似,但比接口功能更豐富
?
二、創建與遵守Protocol
1、創建Protocol
創建Protocol很簡單,如下圖:
比如我們填寫的文件名為MyProtocol,之后會生成一個MyPotocol.h文件,文件內容如下:
?
#import <Foundation/Foundation.h>//注意下面的NSObject是基協議,而不是之前的基類 @protocol MyProtocol <NSObject>//在此聲明方法@end之后我們就在其中聲明需要的方法,但要注意的是這里只做聲明,不做實現。并且不能聲明變量。具體的實現要在遵守這個協議的類中實現,綜上,protocol就是用來聲明方法的。
?
協議可用定義在單獨.h文件中,也可用定義在某個類中:
(1) 如果這個協議只用在某個類中,應該把協議定義在該類中
(2) 如果這個協議用在很多類中,就應該定義在單獨文件中
?
2、基協議
(1)NSObject是一個基類,是最根本最基本的類,任何其他類最終都要繼承它
(2)其實還有一個協議,名字也叫NSObject,它是一個基協議,最根本最基本的協議
(3)NSObject協議中聲明了很多最基本的方法,比如description、retain、release等
(4)建議每個新協議都要遵守NSObject協議
?
3、協議中方法聲明的關鍵字
(1) @required?(默認)
要求實現,如果沒有實現,會發出警告,但不報錯
(2) @optional
不要求實現,不實現也不會有警告
例如:
@require
– (void)test;
?
@optional
– (void)test2;
?
4、遵守協議
首先要#import “協議文件名.h”或者@protocol 協議名稱,但是使用@protocol 協議名稱時只是告訴下面代碼這是一個協議,但不知道協議里面有什么東西,一般只在用到協議內容的時候在#import”協議文件名.h”。在實際開發中常用@protocol 協議名稱。
(1) 類遵守協議
@interface 類名 : 父類名 <協議名稱1, 協議名稱2>
@end
(2) 協議遵守協議
@protocol 協議名稱 <其他協議名稱1, 其他協議名稱2>
@end
?
5、定義一個變量的時候,限制這個變量保存的對象遵守某個協議
類名<協議名稱>?*變量名;
NSObject<MyProtocol> *obj;id<協議名稱> 變量名;
id<MyProtocol> obj2;如果obj和obj2沒有遵守MyProtocol的協議,編譯器會警告。
?
6、@property中聲明的屬性也可用做一個遵守協議的限制
@property (nonatomic, strong) 類名<協議名稱> *屬性名;
@property (nonatomic, strong) Dog<MyProtocol> *dog;@property (nonatomic, strong) id<協議名稱> 屬性名;
@property (nonatomic, strong) id<MyProtocol> dog2;?
三、Protocol的一個簡單示例
例如:
我們新建一個Protocol,命名為HelloProtocol,然后就只會生成一個HelloProtocol.h文件,注意肯定沒有.m文件,協議只是用來聲明方法,并不是來實現的。
#import <Foundation/Foundation.h>@protocol HelloProtocol <NSObject>//默認就是required; @required - (void)requiredMethod;@optional - (void)optionalMethod;@end?
新建Person類,在Person.h中引入協議,如下:
#import <Foundation/Foundation.h> #import "HelloProtocol.h"@interface Person : NSObject<HelloProtocol>@endPerson.m如下:
#import "Person.h"@implementation Person- (void)requiredMethod{NSLog(@"requiredMethod——必須實現的方法"); }- (void)optionalMethod{NSLog(@"optionalMethod——選擇實現的方法"); }@end之后在main.m中創建Person的對象去調用這些方法:
#import <Foundation/Foundation.h> #import "Person.h"int main(int argc, const char * argv[]) {@autoreleasepool {Person *jack = [[Person alloc] init];[jack requiredMethod];[jack optionalMethod];}return 0; }例子很簡單,這里不做過多講解~
原創文章,轉載請注明:?轉載自李峰峰博客
本文鏈接地址:?iOS Protocol詳解
總結
以上是生活随笔為你收集整理的iOS Protocol 详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 争夺智能化船票:如何迈出第一步 ——访百
- 下一篇: PHP Session理解