關于API的設計與實現
創新互聯建站長期為1000+客戶提供的網站建設服務,團隊從業經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯網生態環境。為李滄企業提供專業的成都網站制作、做網站,李滄網站改版等技術服務。擁有十多年豐富建站經驗和眾多成功案例,為您定制開發。
API的設計是軟件開發中一個獨特的領域。
特殊點在于API是供開發者使用的界面,即Application Programmer Interfaces。類似于用戶可以直接使用到的GUI的作用一樣。所以相對于依據軟件設計的原則,考慮用戶的”體驗”會更加重要。
狹義上API可能只是一個動態庫(共享庫)提供功能的接口定義。廣義上API分為public API,以及internal API之分。既有整體軟件系統對外輸出的接口(包括與設備通訊的接口),也有系統內一個底層模塊提供給上層模塊使用的接口定義。
對于一般的開發任務,常常思考的是保證功能的正確性和設計的完美,可以不斷嘗試做創新和重構。但這些原則放到API設計上就不一定正確了,反而需要有些保守。
一.基本知識
iPhone中的API除了公開的 API:Published API外(或者叫文檔中記錄的API:Documented API),還有兩類API:私有API:Private API和未公開的API:UnPublished API(或者叫文檔中未記錄的API:Undocumented API)。其中私有API是指放在PrivateFrameworks框架中的API,未公開的API是指雖然放在Frameworks框架中,但是卻沒有在蘋果的官方文檔中有使用說明、代碼介紹等記錄的API。后兩種API是有區別的,按蘋果的說法,未公開的API是還不夠成熟,可能還會變動的API,等完全成型了后會變成公開的API,但是目前不對其提供承諾,就是系統版本升級后可能會失效。而私有API是蘋果明確不能使用的API。雖然兩者有所區別,但是在具體使用方法上是類似的。
二.具體介紹
1.導出生成私有API的頭文件聲明
使用私有或未公開的API,首先需要導出其對應的頭文件,在頭文件里有相關函數的聲明。
工具:
class-dump
class-dump可以從編譯后的Objective-C的二進制文件中提取對應的數據結構及函數等聲明。
使用方法:
為了能在任意目錄下使用class-dump命令,首先建議把class-dump文件拷貝到/user/local/bin/目錄下,然后就可以在任意目錄下執行以下命令:
class-dump /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk/System/Library/Frameworks/UIKit.framework/ UIKit.h
以上命令就可以把 iPhoneSimulator3.0.Sdk中Frameworks框架里的UIKit.Framework框架的數據結構及函數聲明等給提取出來,并且放在UIKit.h這個文件中,之后你就可以在這個頭文件中找需要API的聲明及其使用方式。以同樣的方法,就可以挨個導出你需要那個框架中的API 聲明。
也可以用ericasadun寫的DumpFrameworks.pl(文件中有部分注釋說明)這個文件把私有框架下的API頭文件全部提取出來。使用方法也是首先把class-dump文件拷貝到/user/local/bin/目錄下,然后在任意一個目錄下執行./DumpFrameworks.pl,然后就會在家目錄下產生一個Headers文件夾,里面羅列了私有框架下的API頭文件。
2.使用私有API
導出了私有API的頭文件聲明后,使用方法就比較簡單了,首先在工程中包含進頭文件,然后導入對應的框架,之后就可以類似提供了靜態庫的方式在代碼中使用這些私有API函數。
三.附加說明
iPhone編程中一些非常精致好玩的API都包含在私有API或未公開的API中,雖然可以以這種方式使用這些非常好的API,但是這樣做是存在一定風險的,首先為公開的API有變更的可能,這樣在每個固件版本中,代碼都有可能中斷。同時,最大的問題是使用了私有API的程序是不能放在App Store上銷售的。因此如果只是為了好玩體驗iPhone中這些精彩的API,那沒關系。如果是為了做出程序放在App Store上銷售的,那就不要動私有API的主意了。
runtime 在iOS中是“運行時”的含義,是一套用c語言寫的api,很多人會用但是也僅僅用過最最常用的幾個函數,這次,我將詳細的帶著大家探索下 runtime 的API,這一章就說下 objc/runtime.h 這個文件里的 API ,并且我會把不適用于 ARC 和不支持64位的API剔除掉。
首先,我們先看一個簡單的函數:
這個函數是通過傳入 Class 類型的 cls 來得到 Class 的名字。那我們測試下這個函數:
其中 [Person class] OC中獲得 Class 的方法,當然,你也可以用 runtime 里面的 objc_getClass 等函數,后面我也會講到。
運行結果:
我們可以看到打印出來的結果就是類的名字。
上面既然用到了 [Person class] ,那我們就看下在 runtime 中 [Person class] 的替代函數,都是通過名字來獲得 Class
那這三個有什么區別,從結論上講, objc_getClass 和 objc_lookUpClass 的效果是一致的,在最新的源碼里面,這兩個方法調用的底層也是一致的,當你要找的類不存在的話,就返回nil,而 objc_getRequiredClass 里你要找的類不存在的話,就會崩潰。下面我們來測試下,我們創建一個 Person 類。
運行結果:
最后也確實崩潰了,所以大家使用 objc_getRequiredClass 這個函數時候要慎重小心。
除了用名字獲得類對象以外,還可以用實例對象來獲取:
我們測試下:
運行結果:
完全沒問題。
Class 不僅可以代表類對象,也可以代表元類對象,下面這個函數就是通過名字獲取元類對象。
如果你讀過源碼的話,你就會清楚元類對象儲存的是類方法,類對象儲存的是實例方法,在后面講到Method相關的API的時候,我們在具體講他們之間的區別。
講到元類對象,我們還要關注下這個函數,
這個函數是用來判斷是否是元類對象。
運行結果:
我們可以看到 objc_getMetaClass 生成才是元類對象, objc_getClass 生成的只是類對象。
那么有沒有函數區分類(元類)對象和實例對象呢?當然有:
這個方法只要是類對象或者元類對象都會返回YES:
運行結果:
當然也可以獲得父類對象。
我們新建一個繼承 Person 的類 Student ,然后我們通過 Student 類來獲得 Person 類。
運行結果:
Student 的父類確實是 Person 。
我們知道OC里面可以強轉類型,當然, runtime 里面也有相關方法
這個方法的意思是給一個實例對象設置新的類,返回舊的類
運行結果:
我們可以看出開始的時候 student 的類是 Student ,用了 object_setClass 后就是 Person 類了。
runtime 的動態性還可以動態新增類,下面四個函數分別表示為一個類分配內存,注冊一個類,復制一個類,銷毀一個類
創建一個新類, superclass 是新類所繼承的類,如果為 nil , superclass 就默認為根類,也就是 NSObject , extraBytes 是在類和元類對象的末尾為索引ivars分配的字節數。這一般是0, name 是新類的名字。
注冊類,如果這個類 objc_allocateClassPair 好了,就必須 objc_registerClassPair 才能使用。
這個方法在系統KVO的底層用過,系統不推薦我們自己用。
objc_disposeClassPair 只能銷毀通過 objc_allocateClassPair 創建的類。
我們寫個demo來測試這些方法, objc_duplicateClass 官方不建議使用,那么我們就不測試這函數。
運行結果:
我們可以知道如果僅僅只是 objc_allocateClassPair 的話,你是找不到這個類的,必須再 objc_registerClassPair 才可以找到, objc_disposeClassPair 則是把類銷毀掉,所以再實際開發中,如果我們不再使用自建類的時候,就要及時銷毀,節省內存。
下面兩個函數是關于整個工程的類列表的函數:
這個函數是獲得所有注冊類的列表,我們試用下:
運行結果:
我們看到注冊的類有15765個。
objc_getClassList 也是獲取注冊類的方法.
第一個參數 buffer 已分配好內存空間的數組指針, bufferCount 是數組的個數,如果 bufferCount 的數量小于實際的數組數量,那么 buffer 返回的是所有數組集合的任意一個子類。如果 buffer 為NULL,那么 bufferCount 為0。無論那種情況,返回結果都是當前注冊類的總數。
運行結果:
返回類實例的大小。
運行結果
一個沒有變量或屬性的繼承于NSObject的類占有8個字節。
還有個方法是:
這是一個創建實例的方法, cls 是要創建的類, extraBytes 是額外的字節內存,用來存儲類定義中的實例變量之外的其他實例變量。在源碼中 alloc 方法底層就是用的這個函數。那么,我們用這個函數來初始化 Person 類:
運行結果:
確實能夠成功創建出來。
最后剩下兩個方法:
這兩個方法都和 version 有關,這個version在實際中我也沒發現用處,可能是在改變類的變量或者方法時給定一個標識.
運行結果
下面我們將使用runtime里面最最常用的api,也就是給分類綁定對象,這里,我們先了解下,一個枚舉:
objc_AssociationPolicy 是一個枚舉,里面的枚舉值分別代表要添加的屬性的修飾類型。
OBJC_ASSOCIATION_ASSIGN 相當于 weak
OBJC_ASSOCIATION_RETAIN_NONATOMIC 相當于 strong 和 nonatomic
OBJC_ASSOCIATION_COPY_NONATOMIC 相當于 copy 和 nonatomic
OBJC_ASSOCIATION_RETAIN 相當于 strong 和 atomic
OBJC_ASSOCIATION_COPY 相當于 copy 和 atomic
關于分類的runtime函數,主要有下面3個:
含義分別為設置關聯對象,獲得關聯對象,刪除關聯對象。
我們知道如果在分類的 .h 文件設置屬性并沒有用,調用的時候會發生閃退,這是因為系統并沒有自動為屬性生成 Set 和 Get 方法,所以,我們用上面三個方法來手動關聯對象。
我們創建一個 Person 的分類 Person+Actor.h ,在.h文件里新建一個新屬性 @property(nonatomic, assign)float actingSkill 而不做其他任何處理,這時候, .m 文件就會有警告。
這時候就綁定好了。
在 ViewController 里面去使用下這個屬性
運行結果:
說明set和get方法都成功了。
那么還有一個 objc_removeAssociatedObjects 方法還沒用,這個方法是解除綁定,為了測試這個效果,我們在ViewController里面 touchesBegan 里面去調用這個方法。
運行結果:
之前綁定的結果被移除了。
今天我們這一篇就講到這, runtime 還有很多其他的用法我們下一篇見。
對了,這個是 demo ,喜歡的可以點個星。
IOS API(Application Programming Interface,應用程序編程接口)是一些預先定義的函數,目的是提供應用程序與開發人員基于某軟件或硬件得以訪問一組例程的能力,而又無需訪問源碼,或理解內部工作機制的細節。
基于互聯網的應用正變得越來越普及,在這個過程中,有更多的站點將自身的資源開放給開發者來調用。對外提供的API 調用使得站點之間的內容關聯性更強,同時這些開放的平臺也為用戶、開發者和中小網站帶來了更大的價值。
開放是目前的發展趨勢,越來越多的產品走向開放。目前的網站不能靠限制用戶離開來留住用戶,開放的架構反而更增加了用戶的粘性。在Web 2.0的浪潮到來之前,開放的API 甚至源代碼主要體現在桌面應用上,而現在越來越多的Web應用面向開發者開放了API。
具備分享、標準、去中心化、開放、模塊化的Web 2.0站點,在為使用者帶來價值的同時,更希望通過開放的API 來讓站點提供的服務擁有更大的用戶群和服務訪問數量。
站點在推出基于開放API 標準的產品和服務后,無需花費力氣做大量的市場推廣,只要提供的服務或應用出色易用,其他站點就會主動將開放API 提供的服務整合到自己的應用之中。同時,這種整合API 帶來的服務應用,也會激發更多富有創意的應用產生。
為了對外提供統一的API 接口,需要對開發者開放資源調用API 的站點提供開放統一的API接口環境,來幫助使用者訪問站點的功能和資源。
當然,開放API 的站點為第三方的開發者提供良好的社區支持也是很有意義的,這有助于吸引更多的技術人員參與到開放的開發平臺中,并開發出更為有趣的第三方應用。
文章標題:ios開發api,iOS開發app外錄屏
網站鏈接:http://vcdvsql.cn/article34/dsdidse.html
成都網站建設公司_創新互聯,為您提供服務器托管、電子商務、微信公眾號、建站公司、網站營銷、網站制作
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯