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
3.bool b =[
p respondstoselector
:sel
];
nslog
(@"%i",b
);
判斷person
物件方法中中是否存在
- 號開頭的
setage:方法
4.bool b =[
p respondstoselector
:sel
];
nslog
(@"%i",b
);
判斷person
類方法中是否存在
+ 號開頭的
setage:
方法
5.b =[
person
respondstoselector
:sel
];
nslog
(@"%i",b
);
通過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指標...