OC中的資料型別

2021-07-03 08:12:47 字數 2324 閱讀 5317

在objective-c中,有一些我們之前並不熟悉但是經常見到的資料型別,比如id、nil、nil、sel等等。在很多文章裡,我們都見過這些資料型別的介紹,但是都沒有說的太清楚。

這篇文章從最底層的定義開始,介紹一下這些型別到底是怎麼定義的,這會幫助我們更加深入地了解objective-c。

objective-c中有一些很有趣的資料型別經常會被錯誤地理解。他們中的大多數都可以在/usr/include/objc/objc.h或者這個目錄中的其他標頭檔案中找到。下面是從objc.h中摘錄的一段,定義了一些資料型別:

// objc.h

typedef

struct

objc_class 

*class

;

typedef

struct

objc_object 

*id;

typedef

struct

objc_selector  

*sel;

typedefid(

*imp )

( id

,  sel

, … )

;

typedef

signed

char

bool

;

#define yes             (bool)1

#define no              (bool)0

#ifndef nil

#define nil 0   /* id of nil class */

#endif

#ifndef nil

#define nil 0   /* id of nil instance */

#endif

我們在這裡解釋一下它們的細節:

id和void *並非完全一樣。在上面的**中,id是指向struct objc_object的乙個指標,這個意思基本上是說,id是乙個指向任何乙個繼承了object(或者nsobject)類的物件。需要注意的是id是乙個指標,所以你在使用id的時候不需要加星號。比如id foo=nil定義了乙個nil指標,這個指標指向nsobject的乙個任意子類。而id *foo=nil則定義了乙個指標,這個指標指向另乙個指標,被指向的這個指標指向nsobject的乙個子類。

nil和c語言的null相同,在objc/objc.h中定義。nil表示乙個objctive-c物件,這個物件的指標指向空(沒有東西就是空)。

首字母大寫的nil和nil有一點不一樣,nil定義乙個指向空的類(是class,而不是物件)。

這個很有趣。sel是「selector」的乙個型別,表示乙個方法的名字。比如以下方法:

-[foo count] 和 -[bar count] 使用同乙個selector,它們的selector叫做count。

在上面的標頭檔案裡我們看到,sel是指向 struct objc_selector的指標,但是objc_selector是什麼呢?那麼實際上,你使用gnu objective-c的執行時間庫和next objective-c的執行執行時間庫(mac os x使用next的執行時間庫)時,它們的定義是不一樣的。實際上mac osx僅僅將sel對映為c字串。比如,我們定義乙個foo的類,這個類帶有乙個- (int) blah方法,那麼以下**:

nslog

(@ "sel=%s"

,  @selector

(blah

));會輸出為 sel=blah。

說白了sel就是返回方法名。

從上面的標頭檔案中我們可以看到,imp定義為 id (*imp) (id, sel, …)。這樣說來, imp是乙個指向函式的指標,這個被指向的函式包括id(「self」指標),呼叫的sel(方法名),再加上一些其他引數。

說白了imp就是實現方法。

在objc/objc-class.h中定義了叫做method的型別,是這樣定義的:

typedef

struct

objc_method 

*method;

struct

objc_method 

;

這個定義看上去包括了我們上面說過的其他型別。也就是說,method(我們常說的方法)表示一種型別,這種型別與selector和實現(implementation)相關。

從上文的定義看,class(類)被定義為乙個指向struct objc_class的指標,在objc/objc-class.h中它是這麼定義的:

struct

objc_class 

;

這裡除了介紹一下定義之外就不打算說的太詳細了,今後我們會詳細介紹一下。

OC資料型別

oc是增強了c的特性,所以在變數和基本資料型別上基本與c一致。在oc中變數命名有如下規則 由字母 數字 下劃線 符號組成 必須以字母 下劃線 符號開頭 大小寫敏感 在oc中定義變數的時候不能使用oc的保留字,oc的保留字如下 oc中有如下基本資料型別 int 宣告整型變數 double 宣告雙精度變...

OC基礎資料型別 NSSet

1 集合 集合 nsset 和陣列 nsarray 有相似之處,都是儲存不同的物件的位址 不過nsarray是有序的集合,nsset是無序的集合。集合是一種雜湊表,運用雜湊演算法,查詢集合中的元素比陣列速度更快,但是它沒有順序。nsset set nsset alloc initwithobject...

iOS開發 OC資料型別

以下是oc中的例項,swift部分不適用 ios中的注釋 單行注釋 注釋對 起到解釋說明的作用,注釋是給程式設計師看的,不參與程式執行 多行注釋 xcode快捷鍵 全選 cmd a 複製 cmd c 貼上 cmd v 設定 cmd 注釋 cmd 執行 cmd r 編譯 cmd b 進製轉化 資料型別...