1壁榕、什么是對(duì)象
在學(xué)習(xí)語言的過程中,都會(huì)遇到兩個(gè)問題:面向過程和面向?qū)ο蟆?code>面向過程:分析出解決問題所需要的步驟,然后用函數(shù)把這些步驟一步一步的實(shí)現(xiàn),使用的時(shí)候一個(gè)一個(gè)一次調(diào)用就可以了梨睁。
面向?qū)ο?/code>:把構(gòu)成問題的事務(wù)分解成各個(gè)對(duì)象郭宝,然后協(xié)調(diào)各個(gè)對(duì)象之間的聯(lián)系和通信涡贱,建立對(duì)象的目的不是為了完成一個(gè)步驟钓葫,而是為了描述某個(gè)事務(wù)在整個(gè)解決問題的步驟中的行為。
那么什么是對(duì)象呢嵌灰?此對(duì)象
可不是說男女相親時(shí)候的那個(gè)對(duì)象
弄匕,而是泛指所有具體的事物,都可以稱之為對(duì)象
沽瞭。
2迁匠、什么是類?
類的定義
:將具有相同屬性和共同行為的一組對(duì)象的集合放在一個(gè)單元中,就稱之為類城丧。
比如說:白貓延曙,黑貓,灰貓等等亡哄,它就屬于貓類枝缔。如果貓,狗蚊惯,豬放在一起愿卸,可以抽象出動(dòng)物類。那么貓類就屬于動(dòng)物類的一個(gè)子類截型,而動(dòng)物類則成為貓類的父類趴荸。
類的屬性
:對(duì)象或者實(shí)體所擁有的特征在類中表示為類的屬性。
例如:貓的顏色宦焦。
類的方法
:對(duì)象執(zhí)行的操作成為類的方法发钝。
例如:貓會(huì)抓老鼠。也就是說波闹,對(duì)象的行為酝豪。
3、什么是封裝
在Objective-C中舔痪,一個(gè)對(duì)象是由很多屬性和方法組成的,將屬性和方法相結(jié)合锌唾,共同體現(xiàn)對(duì)象的特性锄码,稱為封裝。封裝可以做到隱藏內(nèi)部實(shí)現(xiàn)晌涕,穩(wěn)定外部接口滋捶。
4、類和對(duì)象的關(guān)系
它們的關(guān)系是余黎,對(duì)象是類的實(shí)例重窟,類是對(duì)象的模板。對(duì)象是通過new className產(chǎn)生的惧财,用來調(diào)用類的方法;類的構(gòu)造方法 巡扇。
類不是憑空造出來的,一般是為了解決具體問題從現(xiàn)實(shí)中抽象出來的垮衷。
5厅翔、iOS中的類
創(chuàng)建一個(gè)mySchoolProject
的項(xiàng)目,新添加一個(gè)學(xué)生類搀突。
由圖可以看到刀闷,這個(gè)類有兩個(gè)文件:.h和.m文件。
在Objective-C中,類是由接口(interface)和實(shí)現(xiàn)(implemention)兩部分組成的甸昏。
@interface部分
1顽分、#import指令
#import
指令和C語言的#include指令類似,但是#import指令能避免頭文件被重復(fù)包含的問題施蜜。且#import<>包含iOS框架類庫(kù)里面類的頭文件卒蘸,#import""包含項(xiàng)目里自定義類的頭文件。
2花墩、實(shí)例變量
在Objective-C中悬秉,類的特征都是用變量來表示的,這種變量稱為實(shí)例變量(成員變量)冰蘑,聲明在@interface下的“{}”中和泌。
3、方法聲明
在接口文件中的功能方法是沒有實(shí)現(xiàn)的祠肥,只是描述了類的行為應(yīng)有哪些武氓,類似C中的函數(shù)原型;功能的實(shí)現(xiàn)要在.m文件中實(shí)現(xiàn)仇箱。并且Objective-C中的繼承語法是“類名:父類名”县恕。
@implemention
實(shí)現(xiàn)部分中的方法分為:實(shí)例方法
和類方法
,實(shí)例方法要實(shí)例化對(duì)象后通過對(duì)象進(jìn)行調(diào)用剂桥,實(shí)例方法允許調(diào)用實(shí)例方法和實(shí)例變量忠烛。以-
開頭。
類方法:以+
開頭权逗,類方法可以調(diào)用類方法美尸,但類方法不可以調(diào)用實(shí)例方法,但是類方法可以通過創(chuàng)建對(duì)象來訪問實(shí)例方法斟薇。
方法名又稱為選擇器师坎。
類的命名規(guī)范
類名要首字母大寫,方法名首字母小寫堪滨,方法名中其他單詞首字母要大寫胯陋,以提高程序的可讀性。
創(chuàng)建和使用對(duì)象
//創(chuàng)建對(duì)象袱箱,完成對(duì)象的聲明遏乔,內(nèi)存分配,初始化
Student *stu = [[Student alloc] init];
或者
Student *stu2 = [Student new];
Objective-C創(chuàng)建對(duì)象的語法:
類名 *對(duì)象名= [[類名 alloc] init];
類名 *對(duì)象名= [類名 new];
Objective-C中給對(duì)象屬性賦值:
stu1->name = @"張三";
stu1->age = 15;
賦值語法:
對(duì)象名->實(shí)例變量名 = 具體值发笔;
Objective-C中的方法
消息傳遞模型(Message passing):是Objective-C中的核心機(jī)制按灶,在Objective-C中,沒有方法調(diào)用這種說法筐咧,只有消息傳遞鸯旁。
//重寫init方法
- (id)init{
if(self = [super init]){
name = @"李四";
age = 17;
}
return self;
}
其中噪矛,if(self = [super init]),此處的[super init]仍然返回子類對(duì)象铺罢,目的是為了初始化父類的實(shí)例變量艇挨。如果返回nil,說明父類沒有alloc成功韭赘。
便利初始化函數(shù)
在使用對(duì)象的過程中缩滨,對(duì)象和對(duì)象的實(shí)例變量的值往往是不同的,所以我們需要在init方法時(shí)傳入個(gè)性化的數(shù)據(jù)泉瞻,在框架類庫(kù)中的一些類里有一系列的以init開頭的方法脉漏,這些方法就是便利初始化函數(shù)。
在.h文件里聲明便利初始化函數(shù)
- (id)initWithName:(NSString *)aName andAge:(int)anAge;
在.m文件里實(shí)現(xiàn)便利初始化函數(shù)
- (id)initWithName:(NSString *)aName andAge:(int)anAge{
if (self = [super init]) {
name = [aName copy];
age = anAge;
}
return self;
}
便利構(gòu)造器袖牙。
上面的便利初始化函數(shù)創(chuàng)建對(duì)象首先還是要調(diào)用alloc方法對(duì)對(duì)象分配內(nèi)存空間侧巨,然后再初始化對(duì)象,代碼還是非常繁瑣鞭达。于是在Cocoa中司忱,有些方法通過吧內(nèi)存分配過程和初始化過程組合起來完成對(duì)象的創(chuàng)建,這種方法稱為--便利構(gòu)造器畴蹭。它們都是類方法坦仍。
在.h文件里聲明便利初始化函數(shù)
+ (id)initWithName:(NSString *)aName andAge:(int)anAge;
在.m文件里實(shí)現(xiàn)便利初始化函數(shù)
//便利構(gòu)造器
+ (id)initWithName:(NSString *)aName andAge:(int)anAge{
Student *student = [[Student alloc] initWithName:aName andAge:anAge];
return student;
}