您現在的位置是:電腦技術吧?>? 故障問題 ??>??ios是誰開發的,ios用什么開發??>??正文詳情

ios是誰開發的,ios用什么開發

井白山2019-12-14 16:42:30 人圍觀
簡介ios開發難嗎我們可以在/usr/include/objc/objc中找到類和對象的定義。H和運行時。H:typedef struct objc_class*類;typedeios 開發教程

我們可以在/usr/include/objc/objc.h 和 runtime.h 中找到對 class 與 object 的定義:  typedef struct objc_class *Class;  typedef struct objc_object {  Class isa;  } *id;  Class 是一個 objc_class 結構類型的指針;而 id(任意對象) 是一個 objc_object 結構類型的指針,其第一個成員是一個 objc_class 結構類型的指針。

注意這里有一關鍵的引申解讀:內存布局以一個 objc_class 指針為開始的所有東東都可以當做一個 object 來對待! 那 objc_class 又是怎樣一個結構體呢?且看:  struct objc_class  {  struct objc_class* isa;  struct objc_class* super_class;  const char* name;  long version;  long info;  long instance_size;  struct objc_ivar_list* ivars;  struct objc_method_list** methodLists;  struct objc_cache* cache;  struct objc_protocol_list* protocols;  };  objc_class 結構體的各成員介紹如下:  isa:是一個 objc_class 類型的指針,看到這里,想起我前面的引申解讀了沒?內存布局以一個 objc_class 指針為開始的所有東東都可以當做一個 object 來對待! 這就是說 objc_class 或者說類其實也可以當做一個 objc_object 對象來對待!對象是對象,類也是對象,是不是有點混淆?別急,ObjC發明(or 重用)了一個術語來區分這兩種不同的對象:類對象(class object)與實例對象(instance object)。

OK,名稱混淆的問題解決,下面我將使用這兩個術語來區分不同的對象,而使用對象這一術語來泛指所有的對象。

ObjC還對類對象與實例對象中的 isa 所指向的類結構作了不同的命名:類對象中的 isa 指向類結構被稱作 metaclass,metaclass 存儲類的static類成員變量與static類成員方法( 開頭的方法);實例對象中的 isa 指向類結構稱作 class(普通的),class 結構存儲類的普通成員變量與普通成員方法(-開頭的方法)。

  super_class:一看就明白,指向該類的父類唄!如果該類已經是最頂層的根類(如 NSObject 或 NSProxy),那么 super_class 就為 NULL。

  好,先中斷一下其他類結構成員的介紹,讓我們厘清一下在繼承層次中,子類,父類,根類(這些都是普通 class)以及其對應的 metaclass 的 isa 與 super_class 之間關系:  規則一:類的實例對象的 isa 指向該類;該類的 isa 指向該類的 metaclass;  規則二:類的 super_class 指向其父類,如果該類為根類則值為 NULL;  規則三:metaclass 的 isa 指向根 metaclass,如果該 metaclass 是根 metaclass 則指向自身;  規則四:metaclass 的 super_class 指向父 metaclass,如果該 metaclass 是根 metaclass 則指向該 metaclass 對應的類;  好吧,文字總是那么乏力,有圖有真相!

  那么 class 與 metaclass 有什么區別呢?  class 是 instance object 的類類型。

當我們向實例對象發送消息(實例方法)時,我們在該實例對象的 class 結構的 methodlists 中去查找響應的函數,如果沒找到匹配的響應函數則在該 class 的父類中的 methodlists 去查找(查找鏈為上圖的中間那一排)。

如下面的代碼中,向str 實例對象發送 lowercaseString 消息,會在 NSString 類結構的 methodlists 中去查找 lowercaseString 的響應函數。

  NSString * str;  [str lowercaseString];  metaclass 是 class object 的類類型。

當我們向類對象發送消息(類方法)時,我們在該類對象的 metaclass 結構的 methodlists 中去查找響應的函數,如果沒有找到匹配的響應函數則在該 metaclass 的父類中的 methodlists 去查找(查找鏈為上圖的最右邊那一排)。

如下面的代碼中,向 NSString 類對象發送 stringWithString 消息,會在 NSString 的 metaclass 類結構的 methodlists 中去查找 stringWithString 的響應函數。

  [NSString stringWithString:@str];  好,至此我們明白了類的結構層次,讓我們接著看類結構中的其他成員。

  name:一個 C 字符串,指示類的名稱。

我們可以在運行期,通過這個名稱查找到該類(通過:id objc_getClass(const char *aClassName))或該類的 metaclass(id objc_getMetaClass(const char *aClassName));  version:類的版本信息,默認初始化為 0。

我們可以在運行期對其進行修改(class_setVersion)或獲取(class_getVersion)。

  info:供運行期使用的一些位標識。

有如下一些位掩碼:  CLS_CLASS (0x1L) 表示該類為普通 class ,其中包含實例方法和變量;  CLS_META (0x2L) 表示該類為 metaclass,其中包含類方法;  CLS_INITIALIZED (0x4L) 表示該類已經被運行期初始化了,這個標識位只被 objc_addClass 所設置;  CLS_POSING (0x8L) 表示該類被 pose 成其他的類;(poseclass 在ObjC 2.0中被廢棄了);  CLS_MAPPED (0x10L) 為ObjC運行期所使用  CLS_FLUSH_CACHE (0x20L) 為ObjC運行期所使用  CLS_GROW_CACHE (0x40L) 為ObjC運行期所使用  CLS_NEED_BIND (0x80L) 為ObjC運行期所使用  CLS_METHOD_ARRAY (0x100L) 該標志位指示 methodlists 是指向一個 objc_method_list 還是一個包含 objc_method_list 指針的數組;  instance_size:該類的實例變量大小(包括從父類繼承下來的實例變量);  ivars:指向 objc_ivar_list 的指針,存儲每個實例變量的內存地址,如果該類沒有任何實例變量則為 NULL;  methodLists:與 info 的一些標志位有關,CLS_METHOD_ARRAY 標識位決定其指向的東西(是指向單個 objc_method_list還是一個 objc_method_list 指針數組),如果 info 設置了 CLS_CLASS 則 objc_method_list 存儲實例方法,如果設置的是 CLS_META 則存儲類方法;  cache:指向 objc_cache 的指針,用來緩存最近使用的方法,以提高效率;  protocols:指向 objc_protocol_list 的指針,存儲該類聲明要遵守的正式協議。

  總結:  ObjC 為每個類的定義生成兩個 objc_class ,一個即普通的 class,另一個即 metaclass。

我們可以在運行期創建這兩個 objc_class 數據結構,然后使用 objc_addClass 動態地創建新的類定義。

版權聲明:本文由 井白山 整理編輯。

原標題:ios開發是什么,ios 開發重點

轉載注明出處:http://www.dn9ww09s.icu/fault/15461.html

上一篇:iOS3D游戲,ios 3dtouch

下一篇:沒有了

文章評論

    共有條評論來說兩句吧...

    用戶名:

    驗證碼:

作者推薦

  • 物理解密pc游戲,物理游戲

    物理解密pc游戲,物理游戲 相關圖片pc是指什么本文主要介紹如何獲取PC機和板卡的物理地址。您可以參考以下代碼來獲取PC的物理地址命名空間:使用系統。管理;代碼如下:///summary///get MAC的物理地址怎么算...

  • 訪問文件時出錯,訪問pptx文件時出錯

    訪問文件時出錯,訪問pptx文件時出錯 相關圖片為什么文件訪問被拒絕在同一個程序中,一些瀏覽器會出錯,而其他瀏覽器則不會。錯誤的原因是設置MIME類型的代碼錯誤。如果是JSP文件:代碼如下:%@page contenttype=刪除文件時訪問被拒...

  • 網頁亂碼如何解決,網頁打開亂碼怎么解決

    網頁亂碼如何解決,網頁打開亂碼怎么解決 相關圖片電腦顯示亂碼JSP開發與應用中,中文置亂是一個常見的問題,其根源是:web容器默認字符處理代碼是iso-8859-1。示例1:當顯示JSP頁面時,htmlheadtitle手機解決html文件亂碼...

  • 因為找不到必要的CMap文件,找不到必要的cmap文件

    因為找不到必要的CMap文件,找不到必要的cmap文件 相關圖片無法置入文檔因為上周安裝Office 2003升級修補程序失敗后,每次打開excel時,都會找到安裝文件,并提示您找不到必需的安裝文件sku001.cab。在網上搜索后,我發現保存pdf格式...

  • 數組長度和字符串長度,數組的長度可以是字符串嗎

    數組長度和字符串長度,數組的長度可以是字符串嗎 相關圖片java字符串長度本文的例子描述了PHP將字符串隨機劃分為不同長度的數組的方法。與您分享以供參考。具體分析如下:這里使用PHP對指定長度范圍內的字符串進行隨機劃分,劃分后的結果...

  • 程序崩潰怎么解決,應用程序崩潰怎么解決

    程序崩潰怎么解決,應用程序崩潰怎么解決 相關圖片微信小程序崩潰我們經常在iPhone或iPad平板電腦上遇到應用程序崩潰的問題。有時我們打開一個應用程序,它就會閃回。這對開發人員來說絕對是個頭疼的問題。如何獲取IOS設備崩軟件崩...

  • asp分頁代碼,asp分頁代碼123

    asp分頁代碼,asp分頁代碼123 相關圖片asp下一頁代碼這是用于生成靜態頁的ASP paging list的ASP applet腳本代碼:!--include file=CONN.ASP--htmlheadlitleasp帶數字的分頁...

  • 字符串去掉空格,c去掉字符串的空格

    字符串去掉空格,c去掉字符串的空格 相關圖片去掉字符串中的某個字符一。弦。Trim()Trim()是刪除第一個和最后一個空格。2。replace(,);要刪除所有空格,包括第一個和最后一個空格,中間代碼如下:String St字符串刪除空格...

  • memcached安裝,memcached安裝教程

    memcached安裝,memcached安裝教程 相關圖片memcached教程本文主要介紹在PHP中安裝memcached擴展的注意事項。本文介紹了服務器的安裝、launchpad、memcached擴展的安裝以及php.ini的配置。對緩存memcached...

  • 如何調整列寬,如何調整表格的行高和列寬

    如何調整列寬,如何調整表格的行高和列寬 相關圖片excel自動調整行高列寬DataGridView有一個名為autosizecolumnmode的屬性,它有幾個枚舉值:1。所有單元格調整列寬以適應列中所有單元格(包括標題單元格)的內容如何設置列寬...

熱評文章

  • 什么是延遲加載,延遲加載和立即加載

    什么是延遲加載,延遲加載和立即加載 相關圖片延遲加載的好處本文主要介紹在JavaScript應用程序中使用requirejs來實現延遲加載。JavaScript是一個流行的JS庫。您可以引用簡單或復雜的web應用程序,html延遲加載...

  • emlog友情鏈接插件,Typecho插件

    emlog友情鏈接插件,Typecho插件 相關圖片typecho優酷插件本文主要介紹Typecho插件編寫教程(2):編寫一個新的插件,這是一系列文章中的第二篇。對于需要參考下一節的朋友,我們了解插件的基本結構,并且需要一個示例來實...

  • EL表達式難嗎,EL表達式和JSTL標簽

    EL表達式難嗎,EL表達式和JSTL標簽 相關圖片el表達式輸出首先,JSP e l語言定義了El(表達式語言)的目的:使JSP更易于編寫。表達式語言的靈感來源于ECMAScript和XPath表達式語言,為JSP中的表達式el表達式和jstl...

  • 數據庫怎么和程序鏈接,數據庫和程序如何連接

    數據庫怎么和程序鏈接,數據庫和程序如何連接 相關圖片程序鏈接vip數據庫一。刪除記錄opendataconn'open the database connection xxlb=rtnreplaceint(trim(request(數據庫怎么和網頁鏈接...

  • request和response,request response

    request和response,request response 相關圖片關于response用法本文主要介紹了asp.ne響應對象和請求對象的使用。對于朋友,請參考以下1。響應:服務器發送給客戶端的信息,或服務器發送給用戶的輸出。重定向:將客戶端重定向到...

  • iOS3D游戲,ios 3dtouch

    iOS3D游戲,ios 3dtouch 相關圖片ios3dtouch在哪開首先需要獲取mono.data.sqlite.dll文件和system.data.dll文件。如果你在MAC上使用unity,那就太悲劇了。我找不到這兩個文件,3dtouch怎么用...

  • 給數組排序,對數組進行排序

    給數組排序,對數組進行排序 相關圖片數組隨機排序本文給出了一個在JavaScript中實現隨機數組排序的例子。與您分享以供參考。具體實現方法如下:?1234函數洗牌(o){for(VaR J,x,I=o.le快速排序數組...

  • mongodb php,php怎么使用mongodb

    mongodb php,php怎么使用mongodb 相關圖片nginx php說到PHP和mongodb,我們首先要介紹一下PHP的官方手冊。網站是:http://us.php.net/manual/en/book.mongo.php。接nginx phpfpm...

  • 簡體轉繁體,簡體字繁體字

    簡體轉繁體,簡體字繁體字 相關圖片word繁體轉簡體%Test1=新的?.中國?Test2=新信譽。China response.write big5andgb2312(test1,1)response.writ中的繁體字...

  • jsp服務器都有哪些,jsp是在服務器運行

    jsp服務器都有哪些,jsp是在服務器運行 相關圖片web服務器 應用服務器Java只能獲取一次,而且到達頁面的時間是靜態的。然而,通過JS與Java的合作,Java巧妙地實現了這一功能。Java獲取服務器時間,并將其動態顯示到JSP頁jsp上傳文件到...

關注微信

变脸官网查询