Objective-C 中的方法回掉

來源:互聯網
上載者:User

標籤:io   os   使用   sp   strong   on   資料   問題   bs   

Objective-C 中的方法回掉 

Objective-C 中的方法調用

 

OC 類似C+,避免不了的內部的各種通訊手段,函數調用,變數傳遞等,避免不了各種回掉等。

一、class直接調用 或者 obj調用

OC內方法主要分為兩種,一種  “-” 開頭的執行個體方法,這種方法顧名思義,一定要有具體的執行個體對象才能去掉用。

如: [obj methodName];

另一種是以 “+” 開頭的靜態方法,這類方法一般不通過建立對象就能調用,直接通過 [ClassName StaticMethodName],就可以實現方法的調用。

如: [ClassName StaticMethodName];

 

二、代理設計模式

單從設計模式上來說,可能覺得代理是個很複雜的東西,其實無非是讓某個OBJ 保留一個可以使用的指標,在關鍵時刻把某部分任務交付於指標所保留指向的那個對象去完成,這種手段比較常見(可以做資料傳遞,也可以做方法回掉(在兩個class中去調用對方的方法)。

C+ 中除了保留一個指標以外,在使用的時間,指標指向某個對象的地址,可以通過這個指標擷取到對應的對象去做對應的任務,C+的特性是方法調用的時間必須要清楚該對象所屬的具體的Class 的類別,否則系統會報錯說找不到某個對應的method,直接導致編譯錯誤,這些都跟他的特性有關。所以會存在某些對應的強弱類型轉化。 如果由子類型對象向父類是安全的,反過來則是非常危險的了。

iOS裡面的代理主要是一個公用的協議、協議對應的class、以及要實現協議的class三部分組成。iOS 的delegate同C++ 有類似,但也有區別。delegate的聲明一般是id類型 的,id 類型類似與C++ 裡面的  (void *),可以指向任意對象。首先代理類要想在某個時刻調用別人的方法,代理類必須定義一個對應協議, 之後代理類就可以按照自己的協議模板來走, 最終協議的實現由其他類來完成。最終結果是代理類沒有實現該方法,但是可以調到該方法,實現協議的類實現了對應的方法但是一般不直接調用該方法。代理類和實現代理類在發生調用的時間,由中間的一個指標來聯通著上下起到一個控制鏈的作用。

備忘: 在代理類中調用協議中的方法的時間盡量按照objective—C的規則來走,避免不必要警告問題,定義好對應的協議,在代理類中按照這個規則來走,

 

如:

@protocol  JDFooterLoadingViewDelegate;

@interface JDFooterLoadingView : UIView {

}

A1.  @property (nonatomic,assign)id<JDFooterLoadingViewDelegate> delegate;      

// 可以使用泛型

@end

 

@protocol JDFooterLoadingViewDelegate <NSObject>

@optional

- (void)footerLoadingViewBackAction:(id)sender;

@end

調用時間:

A2 . if ([self.delegate respondsToSelector:@selector(footerLoadingViewBackAction:)]) {

        [self.delegate footerLoadingViewBackAction:sender];

    }此處如果沒有聲明定義protocol,在做方法真別判斷時間就會顯示警告,雖然OC已耗用時間才會決定具體的類型,不會導致crash,但是編譯時間會產生警告。建議按照規則來。

 

JDFooterLoadingViewDelegate協議由初始化使用JDFooterLoadingView的那個類去完成

 

後註:

項目中有部分class,只保留一個delegate的指標,之後A2處發生警告,為消除警告,此地方只能用指標強轉去避免。(將self.delegate 強制轉換成實現協議的class類型)

 

二、閉包( block)

ViewControllerA -> ViewControllerB,  ViewControllerB執行完成後需要立即調用ViewControllerA中的操作,這個時間除了代理外使用閉包也是很好的選擇,在ViewControllerB中定義一個block,

 

在ViewControllerA 中跳轉時間

ViewControllerA.m

ViewControllerB *vcb =[ [ViewControllerA alloc] init];

vcb.complateBlock = ^{

//do something;

};

閉包的實現在ViewControllerA中,真正調用在ViewControllerB中,這種手段也可以解決問題。

 

閉包與代理優缺點,閉包思路更加清晰,不用定義協議實現方法等煩瑣操作,但是閉包本身也是一種對象,再次增加對象生命週期的管理,還要避免重複引用等。

 

三、 通知模式

NSNiotificationCenter  ,上述問題在ViewControllerB拋出通知,ViewControllerA增加監聽, 缺點(邏輯斷點)。

KVO,與NSNiotificationCenter 相類似。

Objective-C 中的方法回掉

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.