日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

协议,委托

發(fā)布時間:2023/12/18 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 协议,委托 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

從開始從事OC工作到現(xiàn)在大概1年多了,從當(dāng)初接觸oc的"協(xié)議"的不明白,到現(xiàn)在代碼中隨處可見的委托,協(xié)議,其中感悟頗多。

首先,大家應(yīng)該都明白的是委托是協(xié)議的一種,顧名思義,就是委托他人幫自己去做什么事。也就是當(dāng)自己做什么事情不方便的時候,就可以建立一個委托,這樣就可以委托他人幫自己去實現(xiàn)什么方法。 其次,我簡單的總結(jié)了一下自己用到的委托的作用有兩個,一個是傳值,一個是傳事件。 1.所謂傳值經(jīng)常用在b類要把自己的一個數(shù)據(jù)或者對象傳給a類,讓a類去展示或者處理。(切分緊耦合,和代碼分塊的時候經(jīng)常用) 2.所謂傳事件就是a類發(fā)生了什么事,把這件事告訴關(guān)注自己的人,也就是委托的對象,由委托的對象去考慮發(fā)生這個事件后應(yīng)該做出什么反映。(這個經(jīng)常見,例如在異步請求中,界面事件觸發(fā)數(shù)據(jù)層改變等等) 3.利用委托賦值,這種方法感覺是為了不暴露自己的屬性就可以給自己復(fù)值,而且這樣更方便了類的管理,只有在你想要讓別人給你賦值的時候才調(diào)用,這樣的賦值更可控一些。(例如tableView中的委托(dateSource)中常見)。 最后,我想分享一下在使用委托的時候的一些心得和注意事項。 心得:delegate的命名要準(zhǔn)確,盡量看名字就知道用法。delegate和通知有的用法有些象,但是前者是單對單的,后者是單對多的情況。 注意:在dealloc要把delegate至為nil,還有就是delegate設(shè)置屬性的時候要用assign,不要用retain。 委托

在IOS中委托通過一種@protocol的方式實現(xiàn),所以又稱為協(xié)議.協(xié)議是多個類共享的一個方法列表,在協(xié)議中所列出的方法沒有響應(yīng)的實現(xiàn),由其它人來實現(xiàn).這叫好比我想買個手機(jī),所以我有個buyIphone 方法,但是我不知道誰那買手機(jī),所以把這個需求發(fā)布出去(比如公布在網(wǎng)站上),如果有賣手機(jī)的商人(也就是說他能實現(xiàn)buyIphone這個方法)看到,他就會接受我的委托,(在商人自己的類中實現(xiàn)<XXXdelegate>),那么我的委托對象就指向了這個商人..當(dāng)我要買手機(jī)的時候,直接找他就行了.

例如:

@protocol MyDelegate -(void)buyIphone:(NSString *)iphoneType money:(NSString *)money;@end @interface My : NSObject {id<MyDelegate> deleage; } @property(assign,nonatomic)id<MyDelegate> delegate; @end

代碼中聲明了一個協(xié)議 名叫Mydelegate,在其中有一個buyIphone方法,即一個委托項。當(dāng)我要購買手機(jī)的時候只需要通過delegate 調(diào)用 BuyIphone方法即可.

如下:

-(void)willbuy {[delegate buyIphone:@"iphone 4s" money:@"4888"];}

我不必關(guān)心誰現(xiàn)實了這一委托,只要實現(xiàn)了這個委托的類,并且buyIphone是聲明的委托中必須實現(xiàn)的方法,那么就一定能夠得到結(jié)果.

例如:商人類實現(xiàn)了這一委托(用<Mydelegate>表示實現(xiàn))

#import <Foundation/Foundation.h> #import "My.h" @interface Business : NSObject<MyDelegate>@end

然后在 @implementation Business 中調(diào)用 buyIphone方法

#import "Business.h"@implementation Business-(void)buyIphone:(NSString *)iphoneType money:(NSString *)money {NSLog(@"手機(jī)有貨,這個價錢賣你了,發(fā)貨中!!"); } @end 委托是Cocoa中最簡單、最靈活的模式之一。委托是指給一個對象提供機(jī)會對另一個對象中的變化做出反應(yīng)或者影響另一個對象的行為。其基本思想是:兩個對象協(xié)同解決問題。一個對象非常普通,并且打算在廣泛的情形中重用。它存儲指向另一個對象(即它的委托)的引用,并在關(guān)鍵時刻給委托發(fā)消息。消息可能只是通知委托發(fā)生了某件事情,給委托提供機(jī)會執(zhí)行額外的處理,或者消息可能要求委托提供一些關(guān)鍵的信息以控制所發(fā)生的事情。
委托方法通常包括3種動詞:should、will、did。

should表示一個動作發(fā)生前,通常帶有返回值,可以在動作發(fā)生之前改變對象狀態(tài)。
will在動作發(fā)生前,委托可以對動作做出響應(yīng),但不帶有返回值。
did在動作發(fā)生后做出的響應(yīng)。

從方法的定義我們不難看出委托模式能夠起到兩方面的作用:

第一:委托協(xié)助對象主體完成某項操作,將需要定制化的操作通過委托對象來自定義實現(xiàn),達(dá)到和子類化對象主體同樣的作用。
第二:事件監(jiān)聽,委托對象監(jiān)聽對象主體的某些重要事件,對事件做出具體響應(yīng)或廣播事件交給需要作出響應(yīng)的對象。

個人理解采用委托模式的好處在于:

1、避免子類化帶來的過多的子類以及子類與父類的耦合
2、通過委托傳遞消息機(jī)制實現(xiàn)分層解耦

委托模式的實現(xiàn)思路:

1、通常是在對象主體包含一個委托對象的弱引用:
@interface?A : NSObject
{
IBOutlet id delegate;
} -(id) delegate;
-(void) setDelegate:(id)obj;
2、委托對象的實現(xiàn)有兩種方式:正式協(xié)議和非正式協(xié)議,對象主體在協(xié)議中定義委托方法,委托對象可以選擇實現(xiàn)其中某些委托方法,因此如果通過正式協(xié)議定義委托方法需要使用@option。
@protocol?NSSearchDelegate
@option
-(void)didSearchFinish:(*NSNotification) aNotification;
@end
3、連接對象主體和委托,無非就是通過setDelegate:(id)obj來實現(xiàn)。

4、觸發(fā)委托方法。

昨天做了一個demo,用到了簡單代理。

delegate是ios編程的一種設(shè)計模式。我們可以用這個設(shè)計模式來讓單繼承的objective-c類表現(xiàn)出它父類之外類的特征。昨天這個代理實現(xiàn)如下:

?

類GifView是繼承自UIView的,它加載在RootViewController上來通過一個Timer播放動畫。同時,RootViewController需要知道Timer的每次執(zhí)行。

代碼如下。

首先,定義GifView,在其頭文件中定義代理EveryFrameDelegate,同時聲明方法- (void)DoSomethingEveryFrame;

#import <UIKit/UIKit.h>@protocol EveryFrameDelegate <NSObject>- (void)DoSomethingEveryFrame;@end@interface GifView : UIView {NSTimer *timer;id <EveryFrameDelegate> delegate;NSInteger currentIndex; }@property (nonatomic, retain) id <EveryFrameDelegate> delegate;@end

然后,只要在GifView.m中讓Timer在每次執(zhí)行的時候調(diào)用delegate來執(zhí)行DoSomethingEveryFrame,代碼如下

- (id)initWithFrame:(CGRect)frame {self = [super initWithFrame:frame];if (self){timer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(play) userInfo:nil repeats:YES];[timer fire];}return self; }-(void)play {[delegate DoSomethingEveryFrame];}

GifView上的工作就完成了。

下面是RootViewController中的代碼,RootViewController只要在定義GifView的時候指定其代理為自身,就可以知道Timer的每次執(zhí)行:

- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib. CGRect rect = CGRectMake(0, 0, 200, 200);GifView *tmp = [[GifView alloc] initWithFrame:rect];tmp.delegate = self;[self.view addSubview:tmp];[tmp release]; }- (void)DoSomethingEveryFrame {NSLog(@"I'm the delegate! I'm doing printing!"); }

GifView中Timer每次執(zhí)行都會打印一行

I'm the delegate! I'm doing printing!

故,RootViewController就知道Timer的每次執(zhí)行了。

做程序時,經(jīng)常會碰到這樣一種情況:在對象A中有一個對象B,在B中做某個操作時需要調(diào)用A對象的某個方法。這時,我們就需要用代理機(jī)制,也叫委托機(jī)制。

還記得剛接觸面向?qū)ο蟮臅r候,居然在B對象中又alloc了一個A對象,發(fā)現(xiàn)執(zhí)行方法時沒有works,那時不理解新alloc的對象和原來的對象A不是一個東東。
今天專門補(bǔ)習(xí)了一下哈,在網(wǎng)上找了一些資料,綜合了一下,寫了這篇菜鳥教程。

委托代理(delegate),顧名思義,把某個對象要做的事情委托給別的對象去做。那么別的對象就是這個對象的代理,代替它來打理要做的事。反映到程序中, 首先要明確一個對象的委托方是哪個對象,委托所做的內(nèi)容是什么。委托機(jī)制在很多語言中都用到的,這只是個通用的思想,網(wǎng)上會有很多關(guān)于這方面的介紹。

下面以一個簡單的例子介紹一下委托:

一、新建iPhone項目DelegateDemo;

二、添加UIView類ViewA;

三、ViewA.h的內(nèi)容如下:

[cpp]?view plaincopy
  • #import?<UIKit/UIKit.h>??
  • ??
  • @protocol?<a?href="http://www.wuleilei.com/"?target="_blank"><span?style="color:#ff0000">ViewADelegate</span></a>;?//申明代理協(xié)議??
  • ??
  • @interface?ViewA?:?UIView?{??
  • ????id?<<a?href="http://www.wuleilei.com/"?target="_blank"><span?style="color:#ff0000">ViewADelegate</span></a>>?_viewADelegate;??
  • }??
  • ??
  • @property?(nonatomic,?assign)?id?viewADelegate;?//定義代理的屬性,同時要在.m加中??
  • ??
  • @end??
  • ??
  • //代理協(xié)議的內(nèi)容??
  • @protocol?<a?href="http://www.wuleilei.com/"?target="_blank"><span?style="color:#ff0000">ViewADelegate</span></a>?<NSObject>??
  • -?(void)<span?style="color:#008080">viewACallBack</span>;??
  • @end??
  • ??
  • View.m中:??
  • <span>?</span>@synthesize?viewADelegate?=?_viewADelegate;??
  • 三、在DelegateDemoViewController.m中:

    - (void)viewDidLoad {ViewA *viewA = [[ViewA alloc] initWithFrame:CGRectMake(50, 100, 200, 100)];viewA.viewADelegate = self; //設(shè)置viewA的代理為當(dāng)前對象自己[self.view addSubview:viewA];[viewA release];[super viewDidLoad]; }- (void)viewACallBack {NSLog(@"Hi, I am back!"); }

    轉(zhuǎn)載于:https://www.cnblogs.com/zhao123/p/3204765.html

    總結(jié)

    以上是生活随笔為你收集整理的协议,委托的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。