Objective C中的一些特殊的資料型別

2021-09-06 05:18:26 字數 2338 閱讀 2957

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

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

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

typedef

struct

objc_class

*class;

typedef

struct

objc_object

*id;

typedef

struct

objc_selector

*sel;

typedef id (

*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

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

nil

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

nil

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

sel

這個很有趣。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

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

說白了imp就是實現方法

method

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

typedef

struct

objc_method

*method;

struct

objc_method ;

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

class

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

struct

objc_class ;

Objective C中的一些特殊的資料型別

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

python matplotlib中的一些引數問題

import numpy as np import matplotlib.pyplot as plt 生成x軸上的資料 從 1到1,總共有50個點 x np.linspace 1 1,50 定義乙個線性方程 y1 3 x 定義乙個二次方程 y2 x 3 設定x軸的取值範圍為 2到2 plt.xlim...

一些人,一些事,一些

我覺得這是國內it企業浮躁和傳統的官本位性質決定的,導致國內企業都本末倒置。要想改變命運,我覺得有以下出路 1.不做技術了,改做混混 混混的概念很廣泛的,比如銷售 經理 幹部 皮包公司之類其實都屬於這類。中國就是這樣,越浮越掙錢,只有混混才能發財。要不更進一步,做流氓,廣義的流氓,也很不錯。2.專心...