iOS開發(fā)筆記 - 語言篇之Objective-C

類的設(shè)計

面向?qū)ο蟮幕靖拍?/h3>
  • 對象:在現(xiàn)實世界中對象是我們認(rèn)識世界的基本單元,在面向?qū)ο蟪绦蛟O(shè)計中對象是接收消息的單元;每個對象都是獨一無二的;對象都有屬性和行為;對象都屬于某個類关斜。

  • 類:類是對一組具有共同屬性和行為的對象的抽象,它是創(chuàng)建對象的藍(lán)圖和模板铺浇。

  • 消息:對象與對象之間存在著一定的聯(lián)系痢畜,這種聯(lián)系通過消息的傳遞來實現(xiàn)。面向?qū)ο笫澜缰械乃胁僮鞫际峭ㄟ^向?qū)ο蟀l(fā)送消息來實現(xiàn)随抠,對象接收到消息后裁着,會執(zhí)行對應(yīng)的行為。

面向?qū)ο蟮娜笾е?/h3>
  • 封裝:把一個事物包裝起來拱她,使外界不了解它的內(nèi)部的具體情況二驰。在面向?qū)ο蟮某绦蛟O(shè)計中,封裝就是把相關(guān)的數(shù)據(jù)和代碼結(jié)合成一個有機(jī)的整體秉沼,形成數(shù)據(jù)和操作代碼的封裝體桶雀,對外只提供一個可以控制的接口,內(nèi)部大部分的實現(xiàn)細(xì)節(jié)對外隱蔽唬复,達(dá)到對數(shù)據(jù)訪問權(quán)的合理控制矗积。封裝使程序中各部分之間的相互聯(lián)系達(dá)到最小,提高了程序的安全性敞咧,簡化了程序代碼的編寫工作棘捣。

  • 繼承:從已有的類創(chuàng)建新類的過程,提供繼承信息的稱為父類休建,得到繼承信息的稱為子類乍恐,子類和父類之間是IS-A關(guān)系评疗,繼承使得類與類之間形成一個層次結(jié)構(gòu)。與此同時茵烈,繼承也讓變化中的系統(tǒng)具有了穩(wěn)定性和延續(xù)性百匆。

  • 多態(tài):不同結(jié)構(gòu)的對象可以以各自不同的方式響應(yīng)同一個消息,或者說同一個消息可以根據(jù)發(fā)送消息的對象的不同而采用多種不同的操作行為呜投,這是面向?qū)ο笞罹璧牟糠帧?/p>

定義和使用類

定義類的過程是一個抽象的過程加匈,需要進(jìn)行數(shù)據(jù)抽象和行為抽象,數(shù)據(jù)抽象是找到和對象相關(guān)的屬性仑荐,行為抽象是找到和對象相關(guān)的方法雕拼。要完成數(shù)據(jù)抽象和行為抽象,通呈推幔可以從對問題的描述中找名詞和動詞悲没,名詞會成為類或者類中的屬性,動詞會成為類中的方法男图。

類的聲明部分(.h文件)

#import <Foundation/Foundation.h>

@interface CDStudent : NSObject {
@private
    NSString *_name;
    NSUInteger _age;
}

- (instancetype) initWithName: (NSString *) name
                          age: (NSUInteger) age;

- (NSString *) name;

- (void) play: (NSString *) game;

- (BOOL) study: (NSString *) course
      forHours: (NSUInteger) hours;

@end

類的實現(xiàn)部分(.m文件)

#import "CDStudent.h"

const static int MIN_STUDY_HOURS = 120;

@implementation CDStudent

- (instancetype) initWithName: (NSString *) name
                          age: (NSUInteger) age {
    if (self = [super init]) {
        _name = name;
        _age = age;
    }
    return self;
}

- (NSString *) name {
    return _name;
}

- (void) play: (NSString *) game {
    NSLog(@"%@ is playing %@.", _name, game);
}

- (BOOL) study: (NSString *) course
      forHours: (NSUInteger) hours {
    NSLog(@"%@ is studying %@.", _name, course);
    return hours >= MIN_STUDY_HOURS;
}

@end

初始化方法

上面類的定義中,以init打頭的方法稱為初始化方法甜橱,初始化方法在創(chuàng)建對象時調(diào)用以完成對對象的初始化(給對象的屬性賦初始值)

創(chuàng)建對象

CDStudent *stu = [[CDStudent alloc] initWithName:@"Alice" age:18];

給對象發(fā)消息

#import <Foundation/Foundation.h>
#import "CDStudent.h"

int main(int argc, char *argv[]) {
    @autoreleasepool {
        CDStudent *stu = [[CDStudent alloc] initWithName:@"Alice" age:18];
        [stu play:@"LoL"];
        BOOL hasFinished = [stu study:@"Objective-C" forHours:64];
        NSLog(@"%@ %@ mastered Objective-C.", [stu name], hasFinished ? @"has" : @"hasn't");
    }
    return 0;
}

使用訪問修飾符

定義類時逊笆,可以給類中的屬性添加訪問修飾符,包括:

  • @private:私有岂傲,對外界來說是不可見的(不可訪問)难裆。
  • @protected:受保護(hù),對子類公開對其他類相當(dāng)于私有镊掖。
  • @public:公開乃戈,對外界來說是可見的(可以訪問)。

實例方法和類方法

定義類時亩进,可以在方法的返回類型前添加-或+分別表示方法是實例方法或類方法症虑。所謂實例方法就是對象的方法,即發(fā)給對象的消息归薛,因此要創(chuàng)建對象才能調(diào)用谍憔;而類方法是類的方法,即發(fā)給類的消息主籍,可以直接通過類名進(jìn)行調(diào)用习贫,不需要創(chuàng)建該類的對象。我們可以再添加一個類方法來創(chuàng)建學(xué)生對象千元,具體的代碼如下所示苫昌。

+ (instancetype) studentWithName: (NSString *) name
                             age: (NSUInteger) age;
+ (instancetype) studentWithName: (NSString *) name
                             age: (NSUInteger) age {
    // 類方法中的self代表CDStudent類
    return [[self alloc] initWithName:name age:age];
}
// 直接給類發(fā)消息來創(chuàng)建和初始化學(xué)生對象
CDStudent *stu = [CDStudent studentWitWithName:@"Alice" age:18];

那么問題來了,哪些方法應(yīng)該設(shè)計成實例方法幸海,哪些方法應(yīng)該設(shè)計成類方法呢祟身?通常來說屋厘,一個方法與對象狀態(tài)無關(guān)只跟類有關(guān)就要設(shè)計成類方法,反之就要設(shè)計成實例方法月而。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末汗洒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子父款,更是在濱河造成了極大的恐慌溢谤,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件憨攒,死亡現(xiàn)場離奇詭異世杀,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門蔗包,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怨愤,“玉大人,你說我怎么就攤上這事所刀。” “怎么了捞挥?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵浮创,是天一觀的道長。 經(jīng)常有香客問我砌函,道長斩披,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任讹俊,我火速辦了婚禮垦沉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘仍劈。我一直安慰自己厕倍,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布耳奕。 她就那樣靜靜地躺著绑青,像睡著了一般。 火紅的嫁衣襯著肌膚如雪屋群。 梳的紋絲不亂的頭發(fā)上闸婴,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機(jī)與錄音芍躏,去河邊找鬼邪乍。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的庇楞。 我是一名探鬼主播榜配,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吕晌!你這毒婦竟也來了蛋褥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤睛驳,失蹤者是張志新(化名)和其女友劉穎烙心,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乏沸,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡淫茵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蹬跃。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匙瘪。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蝶缀,靈堂內(nèi)的尸體忽然破棺而出丹喻,到底是詐尸還是另有隱情,我是刑警寧澤扼劈,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布驻啤,位于F島的核電站,受9級特大地震影響荐吵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赊瞬,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一先煎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧巧涧,春花似錦薯蝎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缩筛,卻和暖如春消略,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瞎抛。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工艺演, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓胎撤,卻偏偏與公主長得像晓殊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子伤提,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容