1. 程式人生 > >Objective-C 執行時程式設計指南 之 Type Encodings

Objective-C 執行時程式設計指南 之 Type Encodings

為了幫助執行時系統,編譯器將每個方法的返回值型別和引數型別編碼成了字串,並把字串與方法選擇器關聯起來。 它使用的編碼方案在其他情況下也是有用的,因此該方案使用 @encode() 編譯器指令設定成了公共可用的。當給定一個型別說明, @encode() 會返回這個型別的字串編碼。這個型別可以是基礎型別如 int,指標,帶標籤的結構或聯合,或者類名——實際上是可以用作C語言 sizeof() 運算子的引數的任何型別。

char *buf1 = @encode(int **);
char *buf2 = @encode(struct key);
char *buf3 = @encode(Rectangle);

下表列出了型別編碼。注意他們中許多與你為了歸檔或分發而編碼一個物件時使用的程式碼重疊了。並且,有的程式碼你不能在撰寫編碼器時使用,而有的程式碼你想要用於撰寫編碼器時不會由 @encode() 產生。(關於編碼物件以歸檔或分發的更多資訊,參見Foundation框架參考中的 類說明。)

Table 6-1 Objective-C type encodings

Code Meaning
c A char
i An int
s A short
l A long l is treated as a 32-bit quantity on 64-bit programs.
q A long long
C An unsigned char
I An unsigned int
S An unsigned short
L An unsigned long
Q An unsigned long long
f A float
d A double
B A C++ bool or a C99 _Bool
v A void
* A character string (char *)
@ An object (whether statically typed or typed id)
# A class object (Class)
: A method selector (SEL)
[array type] An array
{name=type…} A structure
(name=type…) A union
bnum A bit field of num bits
^type A pointer to type
? An unknown type (among other things, this code is used for function pointers)

重要: Objective-C 不支援 long double 型別。@encode(long double) 返回 d,跟 double 的編碼一樣。

陣列的型別程式碼被括在方括號之中;陣列中元素的個數在左括號之後立即指出,在陣列型別之前。例如,12個指向 float 的指標的陣列會被編碼成:

[12^f]

結構體在大括號裡說明,而聯合體在圓括號裡。結構體的標籤被列在最前面,接著是一個等號,然後結構體的每個欄位的程式碼按順序列出。例如,結構體

typedef struct example {
    id   anObject;
    char *aString;
    int  anInt;
} Example;

會被編碼成這樣:

{example=@*i}

無論將定義的型別名稱(Example)或者結構體標籤(example)傳給 @encode() 都會返回一樣的結果。結構體指標的編碼攜帶了同樣數量的關於結構體欄位的資訊:

^{[email protected]*i}

但是,另一層的間接定址移除了內部型別說明:

^^{example}

物件的處理像結構體一樣。例如,傳遞 NSObject 類名到 @encode() 會產生這樣的編碼:

{NSObject=#}

NSObject 類只聲明瞭一個例項變數, isa,型別是Class。

注意儘管 @encode() 不直接返回它們,執行時系統還為型別修飾詞使用了額外的編碼,列在表6-2中,它們用於在協議中宣告方法。

Table 6-2 Objective-C method encodings

Code Meaning
r const
n in
N inout
o out
O bycopy
R byref
V oneway

相關推薦

Objective-C 執行程式設計指南 Type Encodings

為了幫助執行時系統,編譯器將每個方法的返回值型別和引數型別編碼成了字串,並把字串與方法選擇器關聯起來。 它使用的編碼方案在其他情況下也是有用的,因此該方案使用 @encode() 編譯器指令設定成了公共可用的。當給定一個型別說明, @encode() 會返回這個

IOS 多執行程式設計指南NSThread

1.NSThread基本運用 app啟動時預設都是,包括ViewController裡執行的都是在主執行緒執行的 當計算了過大的時候會造成執行緒阻塞,比如點選按鈕執行下面的方法,只有計算完,結束後,程式才能繼續執行,如果是死迴圈的話,會一直佔用主執行緒,導致

執行程式設計指南執行緒管理(iOS,Mac os )

1.執行緒成本 多執行緒會佔用記憶體和效能資源。 多執行緒另外一個需要考慮的成本是成產成本。設計一個執行緒應用有時候會需要根本性的改變你應用的資料結構的組織方式。要做這些改變可能需要避免使用同步,因為本身設計不好的應用可能會造成巨大的

Objective C執行(runtime)

前言: Objective C的runtime技術功能非常強大,能夠在執行時獲取並修改類的各種資訊,包括獲取方法列表、屬性列表、變數列表,修改方法、屬性,增加方法,屬性等等,本文對相關的幾個要點做了一個小結。 目錄:   (6) 總結 (1)在執行時對函式進行動態替換 : 

Objective C執行(runtime)技術的幾個要點總結

前言: Objective C的runtime技術功能非常強大,能夠在執行時獲取並修改類的各種資訊,包括獲取方法列表、屬性列表、變數列表,修改方法、屬性,增加方法,屬性等等,本文對相關的幾個要點做了一個小結。 目錄:   (6) 總結 (1)在執行時對函式進行動態替換 : cl

Spark程式設計指南四:Spark分散式叢集模式的執行系統架構

文章目錄 官方叢集模式介紹 Cluster Manager有哪些? Standalone Apache Mesos Hadoop YARN Kubernetes Standalone模

[執行]Objective-C執行程式設計(Runtime Programming)

以前還真沒了解過Objective-C的執行時程式設計(Runtime Programming),今天特意在網上搜了下,原來這麼深奧啊 表示現在理解不了,先轉走了再說,之前轉載的文章都是大神們總結的綜合,轉載地址忘記註明了 ,抱歉。 --  [1] 版本和平臺   -

C++程式執行記憶體佈局----------區域性變數,全域性變數,靜態變數,函式程式碼,new出來的變數

宣告兩點: (1)開發測試環境為VS2010+WindowsXP32位; (2)記憶體佈局指的是虛擬記憶體地址,不是實體地址。   1.測試程式碼 #include <iostream> using namespace std; int g_int_a; i

C++/C程式設計指南基本語句(轉)

運算子的優先順序:一元運算子+ - *的優先順序高於對應的二元運算子   【規則 4-1-1】 如果程式碼行中的運算子比較多,用括號確定表示式的操作順序,避免使用預設的優先順序。   複合表示式:如a = b = c = 0   存在的理由1)書寫簡潔;2)可以提高編譯效率。

iOS開發執行程式設計(Runtime Programming)淺讀

  什麼是執行時(Objective-C runtime)?       簡單的來說,Objective-C runtime是一個實現 Objective-C語言的庫。物件可以用C語言的結構體表示,而方法(methods) 可以用C函式實現。       事實上,他們也差不

Objective-C 執行AppleScript腳本

url alloc use 文件中 path str lee nss app 在Objective-C裏事實上也能夠執行AppleScript 第一種方式是Source 將腳本寫到變量字符串裏 NSAppleEventDescriptor *eventDescr

[轉]CC++執行

轉自csdn原文:https://blog.csdn.net/ithzhang/article/details/20160009 圖片請去原文檢視 在使用VC構建專案時,經常會遇到下面的連結錯誤:   初學者面對這些錯誤常常不知所錯:libcmt.lib是什麼東西?msvcrtd.dll又是幹嗎用的?在

c++執行多型複習

C++的多型性用一句話概括就是:在基類的函式前加上virtual關鍵字,在派生類中重寫該函式,執行時將會根據物件的實際型別來呼叫相應的函式。如果物件型別是派生類,就呼叫派生類的函式;如果物件型別是基類,就呼叫基類的函式   1:用virtual關鍵字申明的函式叫做虛擬函式,虛擬函

什麼是c執行庫?

nafxcw.lib 和 libcmt.lib衝突問題。 解決辦法: 屬性設定裡讓程式先找到nafxcw.lib. 解決辦法參考:https://www.cnblogs.com/suiyingjie/archive/2012/10/29/2745031.html 從vs2008 工程

CoreAnimation程式設計指南幾何變換

  本章介紹圖層的幾何組成部分,及他們之間的相互關,同時介紹如何變換矩陣可以產生複雜的視覺效果。   1.1 圖層的座標系 圖層的座標系在不同平臺上面具有差異性。在iOS系統中,預設的座標系統原點在圖層的中心左上角地方,原點向右和向下為正值。在Mac OS

C++11 併發程式設計指南——前言

開場白:前一段時間(大概在8月初)開始寫 《C++11 併發程式設計指南》(最早更新於:http://www.cnblogs.com/haippy),但是由於個人能力有限,加上 9 月初到現在一直在忙著找工作(革命尚未成功),精力有限,難免出現錯誤,希望讀者不吝指正。 另外,這是我在併發程式設

Spark程式設計指南三:RDD基本概念

RDD是什麼? RDD(Resilient Distributed Dataset),彈性分散式資料集,是Spark的核心資料結構抽象。 它是彈性的,具有容錯能力,能夠重新計算失敗結點。 它是分散式的,資料分佈在多個結點上。 它是一個數據集,可以從外部載入資料,可以是文字檔案,JSON,

Spark程式設計指南二:向Spark運算元傳遞函式

文章目錄 向Spark運算元傳遞函式 Java的兩種方法 匿名內部類 建立類實現Function介面 Scala的兩種方法 傳遞匿名函式 定義全域性單例物件中的靜態方法

C++ Boost Thread 程式設計指南

0 前言 標準C++執行緒即將到來。CUJ預言它將衍生自Boost執行緒庫,現在就由Bill帶領我們探索一下Boost執行緒庫。 就在幾年前,用多執行緒執行程式還是一件非比尋常的事。然而今天網際網路應用服務程

java多執行程式設計入門鎖的使用

package com.CUPK.lsz.TraditionalThread; //實現互斥的第一種方法:作為定義詞修飾程式碼 public class TraditonalThreadSynchronized1 { final Outputer outputer = new Outputer(