選擇器和繼承

2022-09-12 23:18:20 字數 2976 閱讀 7903

【選擇器】

一.認識選擇器(selector)

【注】選擇器是乙個變數型別

sel【注】sel的變數裝訊息 類似於函式指標

sel sel = @selector(crash);

[man performselector:sel];

[man performselector:@selector(setname:) withobject:@"tom"];

【注】performselector:最多支援兩個引數

#pragma clang diagnostic push

#pragma clang diagnostic ignored "-warc-performselector-leaks"

#pragma clang diagnostic pop

//在arc(自動記憶體管理)的條件下,使用選擇器,很可能會報警

//可照如上方式去除報警

sel sel = @selector(run);

//這個方法用於編譯時就能確定呼叫的方法

sel sel = nsselectorfromstring(@"run");

//這個方法用於執行時確定呼叫的方法

二.選擇器的作用

【注】1.選擇器支援了ios開發中,控制項的事件響應機制。

2.選擇器可以另乙個方法實現不同功能,增加**復用度。

3.用於方法的**。

三.class

【注】class也是型別,裝類的型別。

class cls = [dog class];

//nsobject自帶類方法class,將當前類轉成class型別。

class cls = [dog class];

id dog = [[cls alloc] init];

//class變數,也能建立物件。

bool ret = [dog iskindofclass:[dog class]];

//判斷乙個物件是否屬於乙個類

class cls2 = nsclassfromstring(@"dog");

//class變數也可以在執行時(runtime)賦值。

【繼承】

【注】這裡說的繼承,指集合的包含關係,即父類和子類的關係

一.認識繼承

(一)從生活邏輯的角度

父類  生物      外星人

子類  動物  變形金剛

父類  動物  變形金剛

子類  人類  汽車人

類 人類  汽車人

物件  我  大黃蜂

【注】父子類的各種稱呼

父類   parentclass    超類 supperclass   基類

子類   childclass        子類 subclass         派生類

【注】【繼承】也可被稱作【派生】。父類擁有的屬性和方法,子類直接獲得,這個過程叫做繼承。子類在父類基礎上,衍生出了自己獨有的屬性和方法,稱為派生。繼承和派生是描述同一事物的兩種側重。

(二)從編寫**的角度

@inte***ce father : nsobject

int a;

int b;

int c;

@property nsstring * name;

- (void)run;

- (void)jump;

@end

@inte***ce son : father

//通過:建立繼承關係繼承到父類的字段,屬性和訊息

//但是子類無法繼承到父類未宣告的方法

//子類也可以派生出自己獨有的字段,屬性和訊息

int d;

@propertynsstring * id;

- (void)swim;

@end

【重寫】有時候從父類繼承到的方法,並不適合子類,子類可以重寫這個方法。

【注】很多時候,子類的方法只需要在父類的同名方法中增補些內容。可以通過關鍵字【supper】呼叫父類的方法,再增添子類獨有的內容。

//重寫父類的jump方法,重寫方法,不用宣告

//重寫的方法會覆蓋掉父類的方法

- (void)jump

nslog(@"i can jump 1.8m!");

//很多時候,重寫父類的方法,只是在父類的功能上添枝加葉。

- (void)showself

//先呼叫父類的showself,再加上自己的功能

[super showself];

nslog(@"%@", self.id);

(三)從記憶體結構的角度

【問】為什麼oc不能sizeof乙個物件的大小或乙個類的大小?和類結構相近的結構體卻可以。

【再問】為什麼oc不能將物件宣告到靜態空間,如棧中?和類結構相近的結構體卻可以。

【答】因為oc的動態繼承編譯機制。所謂動態繼承機制,就是說在編譯時,不能確立類之間的繼承關係,自然無法確定類的大小。只有執行時,才確立類之間的繼承關係。不能在編譯時確定類的大小,自然不能將類的物件建立在棧裡。

二.繼承的作用

編寫物件導向的程式,核心的手法有三:

繼承 封裝 多型

(一)(ios中用的最少)建立大量相似的類

【例】建立象棋中的棋子,車馬士象炮。

可以先建立棋子類,作為父類。

(二)(最常用)繼承乙個官方或第三方類,新增屬性和方法,建立乙個更符合當前工程的新類。

【注】nsstring nsarray nsdictionary 都是【工廠類】不能被繼承,即使被繼承,也不能使用父類的方法。

(三)(不常用到)用繼承方式統一多型介面

【見下一節】

三.多型與類的訊息機制

【多型】過載,重寫,虛函式

//其實多型就是指,同乙個介面不同的實現。

【注】oc的成員方法採用訊息機制,因此都是虛函式。

【虛方法】

1.父類的指標,可以指向子類的物件。

2.響應訊息,不看指標,看物件。

【注】虛方法體現了不同事物被同一事件觸發,有不同的響應。

《選擇器》 四 子代選擇器和後代選擇器

1 doctype html 2 html lang cn 3 head 4 meta charset utf 8 5 title title title 6head 7 body 8 div id father 9 div class red 1 div 10 div 211 p 21 p 12 ...

後代選擇器和子選擇器

後代選擇器 h1 em 選擇器可以解釋為 作為 h1 元素後代的任何 em 元素 有關後代選擇器有乙個易被忽視的方面,即兩個元素之間的層次間隔可以是無限的。例如,如果寫作 ul em,這個語法就會選擇從 ul 元素繼承的所有 em 元素,而不論 em 的巢狀層次多深。div01 ul li div0...

類選擇器和ID選擇器

什麼是選擇器?每一條css樣式宣告 定義 由兩部分組成,形式如下 選擇器在 之前的部分就是 選擇器 選擇器 指明了 中的 樣式 的作用物件,也就是 樣式 作用於網頁中的哪些元素。類選擇器 類選擇器在css樣式編碼中是最常用到的,格式如下 類選擇器名稱 注意 1.英文圓點開頭 2.類選擇器名稱可以任意...