1. 程式人生 > >iOS雜記——category分類、extension擴充套件、protocol協議

iOS雜記——category分類、extension擴充套件、protocol協議

protocol   本質就是一系列的method的宣告,他並不像class是必須的選項,根據自己的設計模式來選擇性的使用。

 protocol協議時為了補充Objective-C 只能單繼承的缺陷而增加的一個新功能。Objective-C重所有的方法都是虛方法,所以在oc重也就沒有關鍵字 virtual一說,有了協議可以補充

Objective-C單繼承的缺陷,協議並不是一個真正的類,在協議的裡面只宣告方法不實現,並且在協議當中不能宣告例項變數,如果一個類實現了某一個協議的方法,那麼稱折各類遵

循(遵守,採用)了這個協議,正式的協議在類中必須被實現,一個類可以實現多個協議,一個協議也可以被多個類實現


Category

http://www.cnblogs.com/chijianqiang/archive/2012/06/22/objc-category-protocol.html

—Category— 首先我們來談談Category。 Objective-C提供了一種與眾不同的方式——Category,可以動態的為已經存在的類新增新的行為。這樣可以保證類的原始設計規模較小,功能增加時再逐步擴充套件。使用Category對類進行擴充套件時,不需要訪問其原始碼,也不需要建立子類。Category使用簡單的方式,實現了類的相關方法的模組化,把不同的類方法分配到不同的分類檔案中。 實現起來很簡單,我們舉例說明。
SomeClass.h
@interface SomeClass : NSObject{
}
-(void) print;
@end 
這是類SomeClass的宣告檔案,其中包含一個例項方法print。如果我們想在不修改原始類、不增加子類的情況下,為該類增加一個hello的方法,只需要簡單的定義兩個檔案SomeClass+Hello.h和SomeClass+Hello.m,在宣告檔案和實現檔案中用“()”把Category的名稱括起來即可。宣告檔案程式碼如下:
#import "SomeClass.h"
 
@interface SomeClass (Hello)
-(void
)hello; @end
實現檔案程式碼如下
#import "SomeClass+Hello.h"
@implementationSomeClass (Hello)
-(void)hello{
    NSLog (@"name:%@ ", @"Jacky");
}
@end 
其中Hello是Category的名稱,如果你用XCode建立Category,那麼需要填寫的內容包括名稱和要擴充套件的類的名稱。這裡還有一個約定成俗的習慣,將宣告檔案和實現檔名稱統一採用“原類名+Category”的方式命名。 呼叫也非常簡單,毫無壓力,如下: 首先引入Category的宣告檔案,然後正常呼叫即可。
#import "SomeClass+Hello.h"
 
SomeClass * sc =[[SomeClass alloc] init];
[sc hello] 
執行結果是: name:Jacky  Category的使用場景: 1、當你在定義類的時候,在某些情況下(例如需求變更),你可能想要為其中的某個或幾個類中新增方法。 2、一個類中包含了許多不同的方法需要實現,而這些方法需要不同團隊的成員實現 3、當你在使用基礎類庫中的類時,你可能希望這些類實現一些你需要的方法。 遇到以上這些需求,Category可以幫助你解決問題。當然,使用Category也有些問題需要注意, 1、Category可以訪問原始類的例項變數,但不能新增變數,如果想新增變數,可以考慮通過繼承建立子類。 2、Category可以過載原始類的方法,但不推薦這麼做,這麼做的後果是你再也不能訪問原來的方法。如果確實要過載,正確的選擇是建立子類。 3、和普通介面有所區別的是,在分類的實現檔案中可以不必實現所有宣告的方法,只要你不去呼叫它。 用好Category可以充分利用Objective-C的動態特性,編寫出靈活簡潔的程式碼。 —Protocol—  下面我們再來看Protocol。 Protocol,簡單來說就是一系列不屬於任何類的方法列表,其中宣告的方法可以被任何類實現。這種模式一般稱為代理(delegation)模式。你通過Protocol定義各種行為,在不同的場景採用不同的實現方式。在iOS和OS X開發中,Apple採用了大量的代理模式來實現MVC中View和Controller的解耦。 定義Protocol很簡單,在宣告檔案(h檔案)中通過關鍵字@protocol定義,然後給出Protocol的名稱,方法列表,然後用@end表示Protocol結束。在@end指令結束之前定義的方法,都屬於這個Protocol。例如: 複製程式碼
@protocol ProcessDataDelegate <NSObject>
@required
- (void) processSuccessful: (BOOL)success;

@optional
- (id) submitOrder: (NSNumber *) orderid;
@end
複製程式碼 以上程式碼可以單獨放在一個h檔案中,也可以寫在相關類的h檔案中,可以視具體情況而定。該Protocol包含兩個方法,processSuccessful和submitOrder。這裡還有兩個關鍵字,@required和@optional,表示如果要實現這個協議,那麼processSuccessful方法是必須要實現的,submitOrder則是可選的,這兩個註解關鍵字是在Objective-C 2.0之後加入的語法特性。如果不註明,那麼方法預設是@required的,必須實現。 那麼如何實現這個Protocol呢,很簡單,建立一個普通的Objective-C類,取名為TestAppDelegate,這時會生成一個h檔案和m檔案。在h檔案中引入包含Protocol的h檔案,之後宣告採用這個Protocol即可,如下:
@interface TestAppDelegate : NSObject<ProcessDataDelegate>;

@end
用尖括號(<...>)括起來的ProcessDataDelegate就是我們建立的Protocol。如果要採用多個Protocol,可以在尖括號內引入多個Protocol名稱,並用逗號隔開即可。例如<ProcessDataDelegate,xxxDelegate> m檔案如下: 複製程式碼
@implementation TestAppDelegate

- (void) processSuccessful: (BOOL)success{
    if (success) {
        NSLog(@"成功");
    }else {
        NSLog(@"失敗");
    }
}

@end 
複製程式碼 由於submitOrder方法是可選的,所以我們可以只實現processSuccessful。 Protocol一般使用在哪些場景呢?Objective-C裡的Protocol和Java語言中的介面很類似,如果一些類之間沒有繼承關係,但是又具備某些相同的行為,則可以使用Protocol來描述它們的關係。不同的類,可以遵守同一個Protocol,在不同的場景下注入不同的例項,實現不同的功能。其中最常用的就是委託代理模式,Cocoa框架中大量採用了這種模式實現資料和UI的分離。例如UIView產生的所有事件,都是通過委託的方式交給Controller完成。根據約定,框架中字尾為Delegate的都是Protocol,例如UIApplicationDelegate,UIWebViewDelegate等,使用時大家可以留意一下,體會其用法。 使用Protocol時還需要注意的是: 1、Protocol本身是可以繼承的,比如:
@protocol A
     -(void)methodA;
@end
@protocol B <A>
     -(void)methodB;
@end

如果你要實現B,那麼methodA和methodB都需要實現。 

2、Protocol是類無關的,任何類都可以實現定義好的Protocol。如果我們想知道某個類是否實現了某個Protocol,還可以使用conformsToProtocol進行判斷,如下:
[obj conformsToProtocol:@protocol(ProcessDataDelegate)] 
好吧,具體的語言特性這次就介紹這麼多。從某種意義上來說,Objective-C是一門古老的語言,發明於1980年。1988年,喬布斯的Next公司獲得了Objective-C語言的授權,並開發出了Objective-C的語言庫和NEXTSTEP的開發環境。NextStep是以Mach和BSD為基礎,Objective-C是其語言和執行庫,後來的事大家都清楚,蘋果買了Next,喬布斯迴歸蘋果,開始神奇的蘋果振興之路,NextStep成了Max OS X的基礎。以後發展越來越好,Objctive-C成了Apple的當家語言,現在基本上是Apple在維護Objctive-C的發展。 在蘋果的AppStore推出之前,Objective-C一直相對小眾,但是其優秀的語言特性似乎一直在為後面的爆發積蓄力量,當蘋果平臺級的應用出現之後,Objective-C開始大放異彩,靜態語言的效率和動態語言的特性得到眾多程式設計師的喜愛,目前它已經以火箭般的速度躥升TIOBE語言排行版第四位。 對於喜愛蘋果技術的技術人員來說,Objective-C是你必須深入瞭解和值得學習的一門語言,希望以後有機會多寫一些相關的文章。 Extension
extension可以 理解成匿名的category,同樣需要括號。
下面就是隱藏私有實現的一個例子,也是extension一個常用的方式。
@interface MyClass : NSObject
@property (retain, readonly) float value;
@end
// Private extension, typically hidden in the main implementation file.
@interface MyClass ()
@property (retain, readwrite) float value;
@end

相關推薦

iOS雜記——category分類extension擴充套件protocol協議

protocol   本質就是一系列的method的宣告,他並不像class是必須的選項,根據自己的設計模式來選擇性的使用。  protocol協議時為了補充Objective-C 只能單繼承的缺陷而增加的一個新功能。Objective-C重所有的方法都是虛方法,所以

[Android 測試] 效能迴歸測試之 MonkeyRunner使用外掛擴充套件結合批處理

一、 MonkeyRunner簡介 monkeyrunner也是一款安卓sdk自有的測試工具,開源,位於\sdk\tools下面,它主要做效能測試,迴歸測試,並且可以自定義測試擴充套件,和monkey是完全不同的。 monkeyrunner 工具提供了一組A

iOS 分類category擴充套件extension協議protocol

分類 category 使用場景分析 1.擴充套件已有的類 有大量的子類,需要新增公用方法,但又無法修改它們的父類的情形(如系統類)。 一般是大量的功能程式碼已經形成,使用子類需要新增新類的標頭檔案等。分類只能新增方法,不能新增屬性。(下文會提到如何新增屬性)2.使用父類私有方法 已經存在了

iOS仿抖音節拍介面Swift,MVVM架構完整專案日曆demo滾動切換分類等原始碼

iOS精選原始碼 在Object-C中學習資料結構與演算法之排序演算法 image 日曆-基本功能都有的日曆 選擇日期 上下月 動畫 仿抖音卡節拍介面 image 垂直、水平方向皆可滾動、header懸浮的列表檢視 image Auto Layout

iOS 仿看了嗎應用指南針測網速等常用工具自定義彈出檢視框架圖片裁剪內容擴充套件等原始碼

iOS精選原始碼 擴充套件內容的cell - folding-cell 一個近乎完整的可識別中國身份證資訊的Demo 可自動快速... JPImageresizerView 仿微信的圖片裁剪 帶年月和至今以及設定分鐘間隔的時間選擇器(picker) 好用的

iOS開發-51】案例學習:動畫新寫法刪除子視圖視圖順序延遲方法button多功能使用方法及icon圖標和啟動頁設置

無法查看 font targe 技術 value lstat tostring sta dict 案例效果: (1)導入所需的素材,然後用storyboard把上半截位置和大小相對固定的東西布局起來。當然,這些控件也要定義成對應地IBOutlet和IBActio

iOS百思不得姐ARKit旋轉動畫立體相冊源碼等

問題 安全問題 3d立體 mem thread con 中學 operation 概率 iOS精選源碼 自定義視圖彈出實現方案 仿寫百思不得姐 ARKit,距離感應,AR尺子 iOS傳感器集錦 AR太陽系,動畫與光線

iOS股票K線圖校園助手適配iPhone X版本檢測等源碼

0.12 適配 環境 cool row 客戶端 1-1 獲取 launch iOS精選源碼 快速創建menuItem控件 YHPhotoBrowser 優化的網絡圖片瀏覽 cocoaAsynSocket demo (包含客戶端和服務端)

iOS今日頭條選擇框動畫效果FlappyBird遊戲源碼

最全 n-n 寫的不好 效果 先來 aec 發送 觸發 easy iOS精選源碼 高仿今日頭條頻道選擇彈框 超級簡單的導航條管理工具EasyNavigation navigationbar 評分視圖,支持點擊,滑動,整數小數評分 心花怒放Animation 仿樂視視

iOS之iOS11iPhone XXcode9 適配指南

rect 可見 器) 直接 tabbar enter home 發生 任務管理 更新iOS11後,發現有些地方需要做適配,整理後按照優先級分為以下三類: 1.單純升級iOS11後造成的變化; 2.Xcode9 打包後造成的變化; 3.iPhoneX的適配 一、單純升級iOS

iOS 圖片本地存儲本地獲取本地刪除

remove fff 地圖 ltm nts document pat manager file 在iOS開發中、經常用到圖片的本地化。 iOS 圖片本地存儲、本地獲取、本地刪除,可以通過以下類方法實現。 p.p1 { margin: 0.0px 0.0px 0.0px

Swift - 協議類擴展(extension 訪問控制(fileprivate,private,internal,public,open)

string ext 定義 新的 不可 mov extension 腳本 () 1,Swift中協議類似於別的語言裏的接口,協議裏只做方法的聲明,包括方法名、返回值、參數等信息,而沒有具體的方法實現。 protocol Person { //讀寫屬性 v

操作系統編程語言分類變量內存管理定義變量

解釋器 value Go 需要 比較 應該 強調 調試 dbo 1,什麽是操作系統 操作系統就是軟件與硬件之間的一個操作程序。 2、為什麽要有操作系統 (1)控制硬件 (2)把控制硬件的接口做成一個完美的接口,供用戶使用。 3、操作系統的三大組成 應用程序 : 操作系統

iOS中類元類isa詳解

exit argv tst eth program ram 通過 classname TE 類相信大家都知道是什麽,如果看過runtime的源碼或者看過相關的文章對isa肯定也不陌生,不過元類(meta class)大家可能就比較陌生了。不過大家也不要擔心,我會細細道來,讓

iOS實現圖形編程可以使用三種API(UIKITCore GraphicsOpenGL ES及GLKit)

圖像處理 運動 esper 之前 類方法 ati ima quartz 環境 這些api包含的繪制操作都在一個圖形環境中進行繪制。一個圖形環境包含繪制參數和所有的繪制需要的設備特定信息,包括屏幕圖形環境、offscreen 位圖環境和PDF圖形環境,用來在屏幕表面、一個位圖

水下通信技術的分類特征應用及其最新研究進展

傳統 滿足 帶來 屬於 廣泛 世紀 線性 加速 位數 海洋覆蓋著地球三分之二的表面積,它是人類探索和研究的最前沿的領域之一。海洋不僅在國際商業和漁業中扮演重要的角色,而且還包含了有關氣候的信息,以及大量急待開發的資源。 水下無線通信是研制海洋觀測系統的關鍵技術,借助海洋觀測

js通過UA判斷iosandroid微信qqqq瀏覽器

function isIPhone(){ //判斷是否是ios var u = navigator.userAgent; var isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios終端 return is

Android仿ios微信左劃條目刪除置頂的實現,程式碼簡潔,更容易理解使用

<span style="font-family:Arial, Helvetica, sans-serif;"><span style="background-color: rgb(255, 255, 255);">歡迎大家</span></span

分類問題的幾個評價指標(PrecisionRecallF1-ScoreMicro-F1Macro-F1

轉自 https://blog.csdn.net/sinat_28576553/article/details/80258619   四個基本概念TP、True Positive   真陽性:預測為正,實際也為正 FP、False Positive  假

Excel 批量快速合併相同的單元格:資料透視表巨集程式碼分類彙總

  Excel 批量快速合併相同的單元格   在製作Excel表格的時候,為了使得自己製作的報表更加簡潔明瞭,方便查閱,經常需要合併很多相同的單元格,如果有幾千幾萬條記錄需要合併的話,真的會讓