OC基础 代理和协议
OC基礎 代理和協議
1.協議
(1)oc語言中得協議:一組方法列表,不需要我們自己實現,由遵守協議的類來實現協議所定制的方法。
(2)協議的使用步驟:制定協議-->遵守協議-->實現協議-->調用協議。
(3)協議聲明的關鍵字:
(a)@required,必須實現,不實現的話在.m文件內會報警告。
(b)@optional,可選實現,不實現的話在.m文件內也不會報警告。
(4)協議和繼承的區別:
(a)相同之處:都可以規范統一類中的方法。
(b)不同之處:繼承的子類不需要再實現一遍父類的方法(除非有父類的方法不能夠走子類的需求),子類可以繼承父類的成員變量。協議之中只能有方法,不能有成員變量。
測試例子:以公司招程序員為例,公司制定的協議:必須會寫代碼,調bug,匯報工作。另外特別要求會唱歌。
制定兩個協議,分別是Coder和Art協議:
#import <Foundation/Foundation.h>@protocol Coder <NSObject>//必須實現的協議 @required - (void)code; - (void)debug; - (void)report;//可以選擇是否實現的協議 @optional - (void)playGame;@end #import <Foundation/Foundation.h>@protocol Art <NSObject> //注意:如果不寫協議關鍵字,默認是@required - (void)singing;@end?
公司類Company,Company.h和Company.m文件:
#import <Foundation/Foundation.h> #import "Coder.h"@interface Company : NSObject@end #import "Company.h"@implementation Company@end?
員工類Staff,Staff.h文件:
#import <Foundation/Foundation.h> #import "Company.h" #import "Art.h" //遵守協議:在需要實現協議的類里面的父類后面<協議名>,如果有多個,協議之間用逗號隔開。 @interface Staff : NSObject<Coder,Art>@endStaff.h文件:
#import "Staff.h"@implementation Staff //實現協議 - (void)code {NSLog(@"我會寫代碼"); }- (void)debug {NSLog(@"我會調試代碼"); }- (void)report {NSLog(@"我還會匯報我的工作"); }- (void)singing {NSLog(@"我會唱歌哦"); }@end?
測試:
#import <Foundation/Foundation.h> #import "Staff.h"int main(int argc, const char * argv[]) {@autoreleasepool {//協議的步驟//1,制定協議:兩種方式,一個是生成協議文件,另外一個直接在制定協議的類里面寫協議的代碼//2,遵守協議:在需要實現協議的類里面的父類后面<協議名>//3,實現協議:在需要實現協議的類的.m文件里面實現協議制定的方法(記得不要在.h文件里面重新聲明協議制定的方法).//4,調用協議. Staff *staff = [[Staff alloc] init];[staff code];[staff debug];[staff report];[staff singing];//要判斷是否有playGame方法存在,存在就執行,否則不執行。//這里playGame沒有實現,所以不會執行。if ([staff respondsToSelector:@selector(playGame)]) {[staff playGame];}}return 0; }?
測試結果:
?
2.代理
代理:A類想去做一件事,但是A類不會做或者不直接做,而是委托B類去做,A委托B做,B就是A的代理。這種模式就叫做代理。
測試例子:這是一個程序員委托朋友找女朋友的故事。
協議(也就是程序員的要求)
#import <Foundation/Foundation.h>//制定協議 @protocol FindGirl <NSObject>- (void)isGirl; - (void)beautiful; - (void)gentle;@end?
程序員類Programmer,Programmer.h文件:
#import <Foundation/Foundation.h> #import "FindGirl.h"@interface Programmer : NSObject@property (nonatomic,retain) id<FindGirl>delegate;- (void)find;@endProgrammer.m文件:
#import "Programmer.h"@implementation Programmer- (void)find {[self.delegate isGirl];[self.delegate beautiful];[self.delegate gentle]; }@end?
朋友類Friend,Friend.h文件:
#import <Foundation/Foundation.h> #import "FindGirl.h"@interface Friend : NSObject<FindGirl>@endFriend.m文件:
#import "Friend.h"@implementation Friend- (void)isGirl {NSLog(@"首先她得是個妹子"); }- (void)beautiful {NSLog(@"其次這個妹子要漂亮"); }- (void)gentle {NSLog(@"最后她要溫柔的哦"); }@end?
測試:
#import <Foundation/Foundation.h> #import "Programmer.h" #import "Friend.h"int main(int argc, const char * argv[]) {@autoreleasepool {//Programmer是委托者,Friend是代理者//代理實現的步驟//1,定義委托者和代理者2個類//2,制定協議//3,代理者遵守協議和實現協議//4,創建代理者對象和委托者對象,并且指定委托者的代理對象//5,調用代理(在委托者里面調用) Programmer *programmer = [[Programmer alloc] init];Friend *friend = [[Friend alloc] init];//friend遵守programmer的協議programmer.delegate = friend;[programmer find];}return 0; }?
測試結果:
?
這里需要注意一下,我們可以把協議寫到委托者里面,這樣比較簡潔。上面的例子可以把FindGirl協議,寫到委托者(程序員)Programmer里面。代碼如下:
#import <Foundation/Foundation.h>@protocol FindGirl <NSObject>- (void)isGirl; - (void)beautiful; - (void)gentle;@end@interface Programmer : NSObject@property (nonatomic,retain) id<FindGirl>delegate;- (void)find;@end?
3.循環引用
循環引用:就是多個對象之間相互引用,形成環狀。
例子:People1幫People2做事,People2幫People1做事。
制定協議:People1Delegate和People2Delegate
#import <Foundation/Foundation.h>//制定People1的協議 @protocol People1Delegate <NSObject>- (void)people1Required;@end #import <Foundation/Foundation.h>//制定People2的協議 @protocol People2Delegate <NSObject>- (void)people2Required;@end?
People1類,People1.h文件:
#import <Foundation/Foundation.h> #import "People1Delegate.h" #import "People2Delegate.h"//實現協議,代表能夠做某事 @interface People1 : NSObject<People2Delegate>//實現協議的對象指針,代表要求別人做某事 //注意:這里屬性的修飾不能使用retain,只能使用weak或assign,如果使用retain就會造成循環引用的問題 @property (nonatomic, weak) id<People1Delegate> delegate;- (void)people1Working;@endPeople1.m文件:
#import "People1.h"@implementation People1 //People1實現People2的協議 - (void)people2Required {NSLog(@"幫people2做事"); }- (void)people1Working {//調用代理的方法(通知代理對象去做某事)[self.delegate people1Required]; }@end?
People2類,People2.h文件:
#import <Foundation/Foundation.h> #import "People1Delegate.h" #import "People2Delegate.h"@interface People2 : NSObject<People1Delegate>@property (nonatomic, weak) id<People2Delegate> delegate;- (void)people2Working;@endPeople2.h文件:
#import "People2.h"@implementation People2- (void)people1Required {NSLog(@"幫people1做事"); }- (void)people2Working {[self.delegate people2Required]; }@end?
測試:
#import <Foundation/Foundation.h> #import "People1.h" #import "People2.h"int main(int argc, const char * argv[]) {@autoreleasepool {People1 *people1 = [[People1 alloc] init];People2 *people2 = [[People2 alloc] init];people1.delegate = people2;[people1 people1Working];people2.delegate = people1;[people2 people2Working];}return 0; }?
測試結果:
轉載于:https://www.cnblogs.com/DWdan/p/5095462.html
總結
以上是生活随笔為你收集整理的OC基础 代理和协议的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: Sublime Text 无法使用Pac
 - 下一篇: 摘抄