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

2021-06-25 07:46:22 字數 1872 閱讀 8369

bjective-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;

#defineyes 

(bool)1

#defineno 

(bool)0

#ifndef nil

#define nil 0 

#endif

#ifndef nil

#define nil 0 

#endif

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

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

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

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

sel這個很有趣。

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

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

在上面的標頭檔案裡我們看到,sel是指向 structobjc_selector的指標,但是objc_selector是什麼呢?那麼實際上,你使用gnuobjective-c的執行時間庫和next objective-c的執行執行時間庫(mac osx使用next的執行時間庫)時,它們的定義是不一樣的。實際上macosx僅僅將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(類)被定義為乙個指向structobjc_class的指標,在objc/objc-class.h中它是這麼定義的:

struct objc_class ;

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

在objective c中,有一些我們之前並不熟悉但是經常見到的資料型別,比如id nil nil sel等等。在很多文章裡,我們都見過這些資料型別的介紹,但是都沒有說的太清楚。這篇文章從最底層的定義開始,介紹一下這些型別到底是怎麼定義的,這會幫助我們更加深入地了解objective c。objec...

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.專心...