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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

category、protocol、delegate总结

發布時間:2025/5/22 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 category、protocol、delegate总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一.category(類別) 類別是一種類擴展的機制,能為現有的類添加新方法。 ①類別的基本語法 @interface部分,如: @interface NSString (NumberConvenience) - (NSNumber *) lengthAsNumber; @end 我們為NSString類添加了名為NumberConvenience的類別。 注:
  • ? ?? 類別只可以添加方法,不可以添加實例變量
  • ? ? ?類別可以添加屬性,但屬性必須是@dynamic類型的
?@implementation部分 @implementation NSString (NumberConvenience) -(NSNumber *) lengthAsNumber{ …... } ②類別的優點
  • ? ? ?將類的實現代碼分散到多個不同的文件和框架中,這樣可以是類劃分成多個模塊,降低類的復雜度,便于維護。
  • ? ? ?類別的擴展功能,已經存在的類可以在不更改的情況下通過類別進行功能擴展。
  • ? ? ?類別可以實現功能的局部化封裝,模擬實現私有方法。
  • ? ? ?通過類別向對象添加非正式協議。這樣任何類的對象都可以作為委托對象來使用,它可以列出對象能夠執行的所有方法。
③類別的缺點
  • ? ? ?類別不可以添加實例變量
  • ? ? ?類別會發生名稱沖突,即類別中的方法與現有方法重名,類別具有更高的優先級。
二.protocol(協議) 類似于C++中的純虛函數,協議只是聲明,沒有實現,在遵從此協議的類中實現 ①協議的基本語法
  • 聲明協議
如: @protocol NSCopying - (id) copyWithZone: (NSZone *) zone; @end
  • 采用協議
在類的@interface聲明中列出協議的名稱,如: @interface Car : NSObject <NSCopying>{ …... } @end //Car
  • @required和@optional屬性(Objective-C 2.0的新特性)
@required屬性要求遵從此協議的方法必須實現這種方法,@optional屬性則不強制要求,可以通過respondsToSelector:@select( )判斷 ②注意事項
  • 正式協議要求顯示的采用
  • 協議名稱必須唯一
  • 采用協議意味著你承諾實現該協議@required屬性的所有方法。否則,編譯器會生成警告來提醒。
  • 協議可以繼承父協議
如: @protocol MySuperDuberProtocol ?<MyParentProtocol> ③協議的意義
  • ?protocol可以將業務方法定義剝離出來,形成單獨的文件,對于不關心的功能可以不關注他的具體實現,這樣有利于分工
三.delegate(委托/代理) 委托就是某個對象指定另一個對象處理某些特定任務的設計模式 如:我們讓A對象去實現一項工作,不過B對象自己不完成這項工作,它有一個代理A對象,A對象會完成此項工作。如下所示: //A.h @interface?A :NSObject -(void)Log; @end //A.m @implementation?A -(void)Log{ NSLog(@"This is A Log"); } @end //B.h @interface?B :NSObject{ A* delegate; } @property?(nonatomic,?retain)A* delegate; -(void)callLog; @end //B.m @implementation?B @synthesize?delegate; -(id)init{ if?(self?= [super?init] ) { delegate?= [[A alloc]init]; } returnself; } -(void)callLog{ NSLog(@"This is B callLog"); [self.delegate Log]; } @end 四.相關題目 ①Objective-C的類可以實現多重繼承嗎?可以實現多接口嗎? Objective-C不可以直接使用多繼承,cocoa中的所有類都是NSObject的子類,要實現多繼承要使用protocol委托代理來實現。可以實現多接口,通過多接口可以實現C++中的多重繼承。 ②繼承和類別在實現中有何區別? ? ? ?
  • 類別可以在不改變原來代碼的情況下往里面添加新的方法,但繼承不可以。
  • 類別只能添加方法,不能刪除修改方法,但繼承即可以增加,也可以修改或者刪除方法。
  • 類別不可以增加屬性,而繼承可以。
③類別和匿名類別(類擴展/extension)的區別
  • 類別中只能增加方法
  • 類擴展不僅可以增加方法,還可以增加實例變量,只是該?實例變量默認是@private類型?的(作用范圍只能在自身類,而不是子類或其他地方);
  • ?類擴展中聲明的方法沒被實現,編譯器會報警,但是類別中的方法沒被實現編譯器是不會有任何警告的。這是因為類擴展是在編譯階段被添加到類中,而類別是在運行時添加到類中。
  • 類擴展是在 .m 文件中聲明私有方法的非常好的方式。
  • 類擴展所聲明的方法必須依托對應類的實現部分來實現(即不能像類別那樣擁有獨立的實現部分(@implementation部分))
  • 類擴展只能本類調用方法,子類也無法調用父類的延展。
④delegate和protocol的結合使用 protocol是一種協議,定義需實現什么樣的公共接口,delegate則是被委托的對象需要實現什么接口,而兩則結合的話則可以理解為被委托的對象需要實現protocol所要求的公共接口。如: - (id <NSNetServiceBrowserDelegate>)delegate; 要求被委托的對象需要實現協議NSNetServiceBrowserDelegate所要求的接口,只需要遵守所需的協議,就可以設置任意的對象為委托。 ⑤談談在實際開發項目中對delegate、protocol、category的應用 protocol&delegate: 在平時工作中,常常出現需要開發一個app,但app本身并不關心業務部分的內容,比如:有一種交易模式是由app端驅動終端進行交易(我們稱app端為上位機),具體的交易的數據采集數據打包由終端負責,而上位機負責和服務器的通訊及UI的顯示,也就是上位機并不需要關心終端的具體交易實現,此時便使用protocol定制一套接口,app只需要調用,具體實現在終端部分實現。但同時,上位機上送數據給服務器的接口由終端進行調用,此時便可以使用delegate實現委托,由上位機實現此接口。 category: 例如:公司內部封裝的一個底層庫中,其中有一個頭文件定義了一個用于存儲藍牙信息的類,這些信息都是只讀屬性。現在需要調用此類,同時想重寫其中一些信息,并添加一些初始化藍牙設備的接口,此時便可以在不定義新的類同時不改變原有類的基礎上使用category進行類的擴展,以達到需求。 ⑥回調函數的實現
  • ? ? ?通過block實現
  • ? ? ?通過protocol實現
  • ? ? ?通過delegate實現
  • ? ? ?結合protocol和delegate實現

轉載于:https://www.cnblogs.com/jobten/p/4694907.html

總結

以上是生活随笔為你收集整理的category、protocol、delegate总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。