Objective-C數(shù)據(jù)類型 - NSObject
對(duì)象
Objective-C(下稱ObjC)語言是一個(gè)C語言的面向?qū)ο蟮姆庋b绊汹,從英文名字上就能看出端倪,Object即為對(duì)象卵贱,等同于C++滥沫、Java中的類(Class)。
對(duì)象(object)键俱,就是ObjC中編程的核心兰绣。所謂對(duì)象和類,就是抽象出來的一類事物的總稱编振,例如我們要寫一個(gè)像微信的應(yīng)用程序缀辩,我就要?jiǎng)?chuàng)建聯(lián)系人
這個(gè)對(duì)象,聯(lián)系人
有自己的屬性党觅,在ObjC中稱謂Property
雌澄,包括用戶名
斋泄、頭像
等內(nèi)容杯瞻。
再比如我們的應(yīng)用程序需要管理全公司車輛,車
就可以作為一個(gè)類炫掐,而轎車
魁莉、客車
則是車
的子類,在ObjC中,子類繼承父類的屬性和方法募胃,并且還可以有自己獨(dú)有的屬性和方法旗唁。
NSObject
在ObjC中,我們使用的框架名為Cocoa,對(duì)應(yīng)iOS的版本叫做Cocoa Touch痹束,這兩個(gè)框架在的部分代碼是相同的检疫,比如最基礎(chǔ)也是最重要的Foundation
框架。
Foundation
框架中幾乎所有的對(duì)象祷嘶,都是以NS開頭屎媳,這是由喬布斯離開蘋果那幾年,創(chuàng)建的計(jì)算機(jī)公司NEXTSTEP的NEXTSTEP操作系統(tǒng)遺留的代碼论巍。
在所有的NS對(duì)象中烛谊,最為基礎(chǔ)的類,就是NSObject
類嘉汰,是Cocoa框架中所有對(duì)象的基類丹禀,所有其他NS對(duì)象,都是NSObject
的子類鞋怀。NSObject
包含了NS類中所有的基本屬性和方法双泪,例如
+ (void)load; //當(dāng)類被引用進(jìn)程序的時(shí)候會(huì)執(zhí)行這個(gè)函數(shù)
+ (void)initialize;//當(dāng)類第一次被執(zhí)行到的時(shí)候這個(gè)函數(shù)會(huì)被執(zhí)行
這兩個(gè)方法,沒有任何關(guān)聯(lián)密似,沒有先后調(diào)用順序只說攒读,一般很少用到,僅有少數(shù)幾種使用方法辛友,將在后面的章節(jié)詳細(xì)講解薄扁。
實(shí)例化
+ (instancetype)alloc;//實(shí)例化函數(shù)
- (instancetype)init; //初始化函數(shù)
+ (instancetype)new; //初始化函數(shù)
方法組成為:
+/- (返回值類型)方法名:(參數(shù)類型)參數(shù)名 :(參數(shù)類型2)參數(shù)名2 等
在ObjC中剪返,函數(shù)分為類方法
和實(shí)例方法
,分別用+
和-
開頭邓梅。
第一個(gè)括號(hào)中的類型脱盲,是返回值類型,可以是對(duì)象日缨,也可以是普通變量類型(int整數(shù)钱反,BOOL布爾值等),也可以無返回值(void)匣距。
上面三個(gè)方法中的instancetype
就是代替當(dāng)前類的類型面哥,例如在NSObject類中,instancetype
就是返回NSObject實(shí)例毅待。
類方法與實(shí)例方法
類方法尚卫,就是可以直接用類名調(diào)用的方法,例如new
方法
NSObject* someObject = [NSObject new];
而init
方法則為實(shí)例方法尸红,需要先調(diào)用
+ (instancetype)alloc; //分配空間吱涉,返回實(shí)例
返回實(shí)例后,用實(shí)例調(diào)用外里。
NSObject* someObject = [[NSObject alloc] init];
這里的嵌套寫法怎爵,等同于
NSObject* someObject = [NSObject alloc];
[someObject init];
函數(shù)參數(shù)
類方法或?qū)嵗椒ǎ梢詡魅霟o限多個(gè)參數(shù)盅蝗,也可以不傳入?yún)?shù)鳖链,書寫的格式就是冒號(hào)(參數(shù)類型)參數(shù)名
,冒號(hào)前面可以有描述墩莫,也可以沒有芙委,一般我們都寫上,例如我們有一個(gè)計(jì)算機(jī)類贼穆,他有兩個(gè)方法
- (BOOL)loginInWithName:(id)name password:(id)password;
- (void)loginOut;
這是我們假設(shè)的兩個(gè)方法题山,分別對(duì)應(yīng)用戶名登陸,和注銷故痊。
登陸方法顶瞳,傳入了用戶名和密碼兩個(gè)參數(shù),返回一個(gè)BOOL結(jié)果告訴用戶是否登陸成功愕秫,而注銷方法則不需要傳入?yún)?shù)慨菱,也沒有返回值。
泛型
ObjC中的泛型戴甩,就是指id類型符喝。因?yàn)镺bjC是運(yùn)行時(shí)鏈接語言,類和實(shí)例的方法的調(diào)用甜孤,是在真正運(yùn)行程序時(shí)候才進(jìn)行綁定的协饲。在編譯的時(shí)候畏腕,如果欺騙了編譯器也是能通過的,但運(yùn)行時(shí)就會(huì)有錯(cuò)誤茉稠。
例如(以下代碼不能直接運(yùn)行描馅,只是示意)
Book* book = [Book new];
id car = book; // 注意這里car是泛型
[car openDoor];// 編譯器并不知道car的真實(shí)類型,這一步不會(huì)報(bào)錯(cuò)
但真正執(zhí)行到openDoor
的時(shí)候而线,才會(huì)知道原來car是一個(gè)book铭污,并沒有開門openDoor
方法,則會(huì)拋出異常膀篮。更多泛型的實(shí)際用法嘹狞,將在后面的章節(jié)講解。
內(nèi)存管理
在xcode引入ARC(自動(dòng)內(nèi)存管理)以后誓竿,NSObjec就不需要手動(dòng)調(diào)用
- (void)dealloc; //釋放
來釋放內(nèi)存了磅网。并且編譯器會(huì)禁止在ARC環(huán)境下,編寫調(diào)用dealloc或其他與引用計(jì)數(shù)相關(guān)的方法烤黍,例如
- (instancetype)retain OBJC_ARC_UNAVAILABLE; //引用計(jì)數(shù)+1
- (oneway void)release OBJC_ARC_UNAVAILABLE; //引用計(jì)數(shù)-1
- (instancetype)autorelease OBJC_ARC_UNAVAILABLE; //加入自動(dòng)釋放池
- (NSUInteger)retainCount OBJC_ARC_UNAVAILABLE; //返回引用計(jì)數(shù)
注意這些方法后的宏OBJC_ARC_UNAVAILABLE
知市,就是告訴編譯器這些方法ARC下禁用傻盟。
實(shí)例比較
- (BOOL)isEqual:(id)object; //對(duì)象比較
@property (readonly) NSUInteger hash; //唯一哈稀值
每一個(gè)內(nèi)存中實(shí)例化的對(duì)象速蕊,都有唯一的hash值,作為比較的參考娘赴。isEqual
方法就是hash值的比較結(jié)果规哲。
類相關(guān)
@property (readonly) Class superclass; //父類
- (Class)class OBJC_SWIFT_UNAVAILABLE("use 'anObject.dynamicType' instead"); //當(dāng)前類
這兩個(gè)函數(shù)返回的數(shù)據(jù)類型為Class,是一個(gè)C語言的結(jié)構(gòu)體诽表。通過下面兩個(gè)方法可以判斷當(dāng)前類的類型唉锌。
- (BOOL)isKindOfClass:(Class)aClass; //是否為aClass
- (BOOL)isMemberOfClass:(Class)aClass; //是否為aClass或其子類
小節(jié)
NSObjec
作為ObjC中的基類,其部分方法的調(diào)用竿奏,是貫穿整個(gè)Cocoa框架開發(fā)的必備技能袄简,務(wù)必要學(xué)會(huì)使用。