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
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之iOS11、iPhone X、Xcode9 適配指南
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(UIKIT、Core Graphics、OpenGL ES及GLKit)
圖像處理 運動 esper 之前 類方法 ati ima quartz 環境 這些api包含的繪制操作都在一個圖形環境中進行繪制。一個圖形環境包含繪制參數和所有的繪制需要的設備特定信息,包括屏幕圖形環境、offscreen 位圖環境和PDF圖形環境,用來在屏幕表面、一個位圖
水下通信技術的分類、特征、應用及其最新研究進展
傳統 滿足 帶來 屬於 廣泛 世紀 線性 加速 位數 海洋覆蓋著地球三分之二的表面積,它是人類探索和研究的最前沿的領域之一。海洋不僅在國際商業和漁業中扮演重要的角色,而且還包含了有關氣候的信息,以及大量急待開發的資源。 水下無線通信是研制海洋觀測系統的關鍵技術,借助海洋觀測
js通過UA判斷ios、android、微信、qq、qq瀏覽器
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
分類問題的幾個評價指標(Precision、Recall、F1-Score、Micro-F1、Macro-F1
轉自 https://blog.csdn.net/sinat_28576553/article/details/80258619 四個基本概念TP、True Positive 真陽性:預測為正,實際也為正 FP、False Positive 假
Excel 批量快速合併相同的單元格:資料透視表、巨集程式碼、分類彙總
Excel 批量快速合併相同的單元格 在製作Excel表格的時候,為了使得自己製作的報表更加簡潔明瞭,方便查閱,經常需要合併很多相同的單元格,如果有幾千幾萬條記錄需要合併的話,真的會讓