OBJ C相關分析 2

2021-06-09 00:43:45 字數 2261 閱讀 3187

1. super

這個關鍵字在obj-c的**裡很常見,安裝oop的思想就是,呼叫父類的方法。

例如下面的**:

@inte***ce classa : nsobject

-(void)setname: (nsstring*)name;

@end

@inte***ce classb : classa ;

-(void)setnumber:(nsstring*)number

-(void)setnumber:(nsstring*)number  name : (nsstring)name;

@end

其中我們這裡僅實現

-(void)setnumber:(nsstring*)number  name : (nsstring)name;

這裡有兩個地方需要注意:

1. [self setnumber : @"1234"];

上面這行**是通過id objc_msgsend(id thereceiver, sel theselector, ...)這個函式來傳送訊息,並由self物件來響應。

2. [super setname : "obj-c"];

而這行**則是通過d objc_msgsendsuper(struct objc_super *super, sel op, ...)這個函式阿里發現訊息。

其中struct objc_super 的結構如下:

struct objc_super ;

他的過程大概為:先從superclass的類物件中查詢對應的sel,這個過程和上面的self物件查詢sel是一致的,如果找到了對應的sel,在用struct objc_super中的reveiver指向的物件去響應sel對應的函式。

所以總的來說:super這個他並不是訊息的真正接收者,但是查詢sel的過程是從superclass的類物件開始的。

2 self

self這個相對於super要簡單很多,一般會把他當作c++中的this指標,其實他與this是有一定的區別的。

區別在於,c++的this指標只在物件方法存在,在靜態方法中是不存在的。

obj-c在物件方法和類方法中都存在self。

在obj-c中,存在於兩個方法中的self代表的意義是完全不同的。

1. 物件方法中self代表的物件本身,和c++中的this一樣。

2. 類方法中的self代表的是類物件,你可以使用[self class]進行操作。例如:你要建立乙個例項

+ (id) getinstance

最後還需要說明一點的是在類方法出現的super,也是類物件,使用方法基本同於self。

總而言之:self在物件方法,和類方法中代表的完全不同的物件(物件本身和類物件)。

3 id

大家都他很熟悉,基本都會說和c/c++的void指標差不多,其實從**層面來看,確實差不多,但是如果仔細去深挖一些,還是有一些差別的。

在討論差別之前,先給出幾個必要的結構體;

typedef struct objc_class *class;

typedef struct objc_object  *id;

id是指向class指標,同時也是指向struct objc_class指標的指標。

struct objc_class;

@inte***ce nsobject

isa:是乙個 objc_class 型別的指標

從上面可以看出,每乙個從nsobject派生出來的物件的首位址處的四個位元組都是乙個isa指標,從obj-c執行時系統的原理(後面會去分析這個原理)可以知道isa指標在方法呼叫的過程中起著關鍵性的作用。其實isa的作用類似於c++的虛表指標。

例如下面這段

classa  objb = [[classb alloc]init];//classb是classa的子類

id obj = objb;

[obj classmethod];//這裡classmethod不管是classa的方法,還是classb的方法,都可以正確的響應,因為isa的作用。

這樣寫的**是沒有任何問題的(不過效率上慢一點,不過也沒有網上說的那麼慢,因為大概也就多了一次指標定址)。但是如果你把c++的void×

來代替id,程式就沒辦法執行了。其中起著關鍵性作用的就是isa指標(後續在討論isa)。這裡只是想說明一下,id乙個指向id是指向class指標的指標,不要簡單的把它與void×等同起來。

obj c相關分析 3

1 copy vs mutablecopy 現在需要說明一下 只有遵守nscopying 協議的類才可以傳送copy訊息,並且實現 copywithzone 方法。只有遵守 nsmutablecopying 協議的類才可以傳送mutablecopy訊息,實現 mutablecopywithzone ...

Objc基礎學習記錄2

1.類 方法名 類方法,靜態成員函式,void fun 2.物件名 方法名 例項方法,非靜態成員函式,void fun 3.帶有冒號必須要有引數 4.property type name type 型別,int,float等 name是方法名字 synthesize property 1 不需要型別...

obj c 開發相關基本名詞解釋

開發相關基本名詞解釋 補完計畫ing.rel noopener noreferrer obj c 開發相關基本名詞解釋 補完計畫ing.long gnu專案創始於1984,旨在開發乙個類似unix且為 自由軟體 自由是指權利,而不是 完整的作業系統,gnu系統。gnu的核心並沒有開發完畢,因此他使用...