1 5 萬能指標 id

2021-07-05 01:38:33 字數 4489 閱讀 3797

id是一種資料型別,並且是一種動態資料型別

資料型別的用途:

1. 定義變數

2. 作為函式的引數

3. 作為函式的返回值

預設情況下所有的資料型別都是靜態資料型別

靜態資料型別的特點:

在編譯時就知道變數的型別,知道變數中有哪些屬性和方法

在編譯的時候就可以訪問這些屬性和方法

並且如果是通過靜態資料型別定義變數,如果訪問了不屬於靜態資料型別的屬性和方法,那麼編譯器就會報錯

應用場景:多型,可以減少**量,避免呼叫了子類特有的方法需要強制型別轉換

id obj1 =[[

person

alloc

]init

];

[

obj1 sleep

];

[

obj1 test

];// person類的私有方法

id obj2 =[[

person

alloc

]init

];

[

obj2 eat

];

[

obj2 test

];// person類的私有方法

為了避免動態資料型別引發的執行時的錯誤,一般情況下如果使用動態資料型別定義乙個變數,在呼叫這個物件的方法之前會 進行一次判斷,判斷當前物件是否能夠呼叫這個方法

1. 判斷指定的物件是否是某乙個類,或者是某乙個類的子類

id obj =[[

student

alloc

]init

];

if

(obj iskindofclass

:[student

class

])

2. 判斷指定的物件是否是當前指定的類的例項

id obj =[[

student

alloc

]init

];

if

(obj ismemberofclass

:[student

class

])

1. 建立物件new做了三件事情:

1>. 開闢儲存空間  + alloc 方法;

2>. 初始化所有的屬性(成員變數) - init 方法;

3>. 返回物件的位址

2. + alloc做了什麼事情

1>. 開闢儲存空間;

2>. 將所有的屬性設定為0;

3>. 返回當前例項物件的位址

person

*p1 =[

person

alloc

];

3. - init做了什麼事情

1>. 初始化成員變數,但預設情況下init的實現是什麼都沒有做;

2>. 返回初始化後的例項物件的位址

person

*p2 =[

p1 init

];

注: + alloc 和 - init 返回的例項物件的位址是同乙個位址

在oc中init開頭的方法,我們稱之為構造方法

構造方法的用途: 用於初始化乙個物件,讓某個物件一建立出來就擁有某些屬性和值

1. 重寫init方法,在init 方法中初始化成員變數

1>. 必須先初始化父類,再初始化子類

2>. 必須判斷父類是否初始化成功,只有父類初始化成功才能繼續初始化子類

3>. 返回當前物件的位址

-

instancetype init

return

self

;

}

2. instancetyp和id的區別

instancetype == id == 萬能指標 == 指向乙個物件

id 在編譯的時候不能判斷物件的真實型別

instancetype 在編譯的時候可以判斷物件的真實型別

1>. id和instancetype除了乙個在編譯時不知道真實型別,乙個在編譯時知道真實型別

2>. id可以用來定義變數,可以作為返回值,可以作為形參,instancetype只能作為返回值

注:以後但凡自定義構造方法,返回值盡量使用instancetype,不要使用id

3. 自定義構造方法 (init自定義構造只用初始化自己的成員變數,父類的父類來處理)

-

(instacetype

)initwithage

:(int

)age andname

:(nsstring

*)name

return

self

;

}

// nslog輸出%@ 最好重寫 - (nsstring *)description;

-

(nsstring

*)description

4. 自定義類工廠方法

1> 類構造方法:initwith.....

-

(instancetype

)initwithage

:(int

)age andname

:(nsstring

*)name

return

self

;

}

2> 類工廠方法:類名開頭.....

+

(instancetype

)personwithage

:(int

)age

四. 類的本質1.

建立乙個人物件

person*p 

=[[person

alloc

]init

];

2.

將age

的setter

方法封裝成

sel

bool b =[

p respondstoselector

:sel

];

nslog

(@"%i",b

);

3.

判斷person

物件方法中中是否存在

- 號開頭的

setage:方法

bool b =[

p respondstoselector

:sel

];

nslog

(@"%i",b

);

4.

判斷person

類方法中是否存在

+ 號開頭的

setage:

方法

b =[

person

respondstoselector

:sel

];

nslog

(@"%i",b

);

5.

通過performselector

呼叫有引數的方法

, 那麼引數必須是物件型別

sel sel1 

=@selector

(setname

:);

[

p performselector

:sel1 withobject

:@"jack"

];

nslog

(@"name = %@",p

.name

);

void指標 萬能指標

void指標 指標型別強制轉換,只是改變了指向物件記憶體大小,而位址沒有變化。指標有兩個屬性 指向變數 物件的位址和長度 但是指標只儲存位址,長度則取決於指標的型別 編譯器根據指標的型別從指標指向的位址向後定址 指標型別不同則定址範圍也不同,比如 int 從指定位址向後尋找4位元組作為變數的儲存單元...

智慧型指標和萬能指標

智慧型指標 智慧型指標 smart pointer 是儲存指向動態分配 堆 物件指標的類。除了能夠在適當的時間自動刪除指向的物件外,他們的工作機制很像c 的內建指標。智慧型指標在面對異常的時候格外有用,因為他們能夠確保正確的銷毀動態分配的物件。他們也可以用於跟蹤被多使用者共享的動態分配物件。智慧型指...

萬能的指標

void指標 void指標一般被稱為通用指標或泛指針,它是c語言關於 純粹位址 的一種約定。void指標指向某個物件,但該物件不屬於任何型別。請看下例。int ip void p 在上例中,ip指向乙個整型值,而p指向的物件不屬於任何型別。在c語言中,任何時候都可以用其他型別的指標來代替void指標...