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的核心並沒有開發完畢,因此他使用...