OC—封裝

學(xué)習(xí)目標(biāo)

1.【了解】異常處理

2.【掌握】類方法

3.【掌握】NSString類

4.【掌握】匿名對(duì)象

5.【掌握】封裝實(shí)例變量

6.【掌握】對(duì)象之間的關(guān)系

一棍鳖、異常處理

什么是異常有咨?

代碼完全符合語(yǔ)法規(guī)范脂新,可以編譯带迟、鏈接颅拦、執(zhí)行丈攒,但是在程序運(yùn)行的時(shí)候承耿,當(dāng)程序處于某種特定情況下的時(shí)候接箫,程序運(yùn)行就會(huì)出錯(cuò)及志,像這樣的情況就叫做程序發(fā)生了異常片排。一旦發(fā)生異常,程序會(huì)立即奔潰速侈。為了避免程序在發(fā)生異常的時(shí)候奔潰率寡,OC提供了@try @catch異常處理。

異常處理語(yǔ)法:

@try {

//可能發(fā)生異常的代碼

}

@catch (NSException *指針名) {

//發(fā)生異常后執(zhí)行的代碼

}

@finally {

//無(wú)論有沒有發(fā)生異常倚搬,都會(huì)執(zhí)行的代碼

}

執(zhí)行步驟:

第一種情況:先執(zhí)行@try中的代碼冶共,如果這里面的代碼發(fā)生了異常,系統(tǒng)就會(huì)把異常信息存儲(chǔ)到@catch中的指針變量,然后執(zhí)行@catch中的代碼捅僵。@catch中的代碼執(zhí)行完畢后家卖,還會(huì)執(zhí)行@finally中的代碼(@finally是可選的)。

第二種情況:先執(zhí)行@try中的代碼庙楚,如果@try中的代碼不發(fā)生異常上荡,@catch中的代碼不會(huì)執(zhí)行。但還是會(huì)執(zhí)行@finally中的代碼(@finally是可選的)馒闷。所以酪捡,@catch中的代碼只有在@try中的代碼發(fā)生異常的時(shí)候才會(huì)執(zhí)行。

注意:

1.@try-@catch只能處理OC中的異常(跟類和對(duì)象有關(guān)的)纳账。

2.寫代碼過(guò)程中盡力使用if來(lái)判斷逛薇,避免異常。

3.@finally不是必須寫的語(yǔ)句疏虫,可以沒有@finally永罚。

二、類方法

OC中的方法分為兩種议薪,對(duì)象方法(實(shí)例方法)和類方法(靜態(tài)方法)尤蛮。

對(duì)象方法:依賴于對(duì)象,對(duì)象方法必須創(chuàng)建對(duì)象斯议,通過(guò)對(duì)象名來(lái)調(diào)用产捞。

類方法:不依賴與對(duì)象,類方法不需要?jiǎng)?chuàng)建對(duì)象哼御,通過(guò)類名來(lái)調(diào)用坯临。

聲明語(yǔ)法:+ (返回值類型)方法名;

//聲明類方法

@interface Person : NSObject

+ (void)test;

@end

//實(shí)現(xiàn)類方法

@implementation Person

+ (void)test{

NSLog(@"this is a class method!");

}

@end

//主函數(shù)里調(diào)用類方法

[Person test];

注意:

1.對(duì)象方法和類方法的方法名可以同名,兩個(gè)方法互不影響恋昼。

2.類方法調(diào)用不需要?jiǎng)?chuàng)建對(duì)象看靠,從效率上而言會(huì)更快一些。

3.對(duì)象方法只能通過(guò)對(duì)象名來(lái)調(diào)用液肌,類方法只能通過(guò)類名來(lái)調(diào)用挟炬。

4.對(duì)象方法中可以直接訪問(wèn)實(shí)例變量和類方法,類方法中不能直接訪問(wèn)實(shí)例變量和對(duì)象方法嗦哆。

5.如果方法不需要訪問(wèn)對(duì)象的實(shí)例變量的時(shí)候谤祖,我們可以將其定義為類方法,提高效率老速。

類方法的規(guī)范

提供一個(gè)和類同名的類方法來(lái)創(chuàng)建一個(gè)對(duì)象粥喜。比如:

+ (Person *)person;//聲明類方法

//實(shí)現(xiàn)類方法

+ (Person *)person{

Person *person = [Person new];//創(chuàng)建對(duì)象person

return person;//返回對(duì)象person

}

提供一個(gè)類方法創(chuàng)建對(duì)象,并讓調(diào)用者可以初始化新創(chuàng)建對(duì)象的實(shí)例變量的值橘券。比如:

+ (Person *)personWithName:(NSString *)name;//聲明類方法

//實(shí)現(xiàn)類方法

+ (Person *)personWithName:(NSString *)name{

Person *person = [Person new];//創(chuàng)建對(duì)象person

person -> _name = name;//將調(diào)用者傳遞進(jìn)來(lái)的參數(shù)賦值給person對(duì)象的實(shí)例變量

return person;//返回對(duì)象person

}

三额湘、NSString類

OC中提供了一個(gè)字符串類NSString卿吐,以對(duì)象的形式存儲(chǔ)字符串。

NSString類的常用方法

//stringWithCString:將C語(yǔ)言字符串轉(zhuǎn)化為OC字符串锋华。

NSString *str = [NSString stringWithCString:"C字符串"];

//stringWithFormat:格式化字符串嗡官,也可以做多個(gè)變量、字符串的拼接供置。

for(int i = 1;i <= 1000;i++){

NSString *str = [NSString stringWithFormat:@"d",i];

NSLog(@"%@",str);

}

//length計(jì)算字符串長(zhǎng)度谨湘,是計(jì)算字符個(gè)數(shù),一個(gè)中文字也是1個(gè)長(zhǎng)度。

NSString *str = @"字符串a(chǎn)bcd";

NSUInteger length = [str length];//這里是長(zhǎng)度為7

//characterAtIndex:獲取指定位置的字符芥丧,位置從0開始遞增。

NSString *str = @"字符串a(chǎn)bcd";

unichar ch = [str characterAtIndex:3];//從0開始計(jì)算

NSLog(@"ch = %C",ch); //%C OC里新增的格式控符,可以輸出單個(gè)中文

//isEqualToString:比較兩個(gè)字符串是否相同坊罢。

NSString *str = @"字符串a(chǎn)bcd";

NSString *str1 = @"字符串a(chǎn)bcd";

BOOL res = [str isEqualToString:str1];

//compare:比較兩個(gè)字符串的大小(ASCII)

NSString *s1 = @"China";

NSString *s2 = @"Japan";

int res = [s1 compare:s2];

NSLog(@"res = %i",res);//s1 < s2則返回1? s1 > s2 返回-1 相等返回0

四续担、匿名對(duì)象

實(shí)例化一個(gè)對(duì)象的時(shí)候,沒有用任何指針指向這個(gè)對(duì)象活孩,這個(gè)對(duì)象就是匿名對(duì)象物遇。并且匿名對(duì)象只能調(diào)用一次,所以如果你只是為了調(diào)用某一個(gè)對(duì)象的對(duì)象方法憾儒,就可以使用匿名對(duì)象询兴。比如:

//Person.h文件

#import

@interface Person : NSObject

{

NSString *_name;

}

- (void)sayHi;

@end

//Person.m文件

#import "Person.h"

@implementation Person

- (void)sayHi{

NSLog(@"這是對(duì)象方法");

}

@end

//main.m文件

#import

#import "Person.h"

int main(int argc, const char * argv[]) {

@autoreleasepool {

//給匿名對(duì)象的實(shí)例變量賦值,不過(guò)匿名對(duì)象只能訪問(wèn)一次,賦值后就不能再使用了

[Person new] -> name = @"jack";

//調(diào)用匿名對(duì)象的對(duì)象方法,調(diào)用完了就不再用這個(gè)對(duì)象了

[[Person new] sayHi];

}

return 0;

}

五、封裝實(shí)例變量

一個(gè)類之中有多個(gè)屬性起趾、方法诗舰,把這些成員封裝在一個(gè)類中,把這個(gè)類當(dāng)做一個(gè)整體來(lái)使用训裆。

封裝的好處:便于管理代碼的維護(hù)眶根,以類為單位來(lái)管理他們。屏蔽內(nèi)部的實(shí)現(xiàn)边琉,對(duì)于外部而言只是一個(gè)對(duì)象属百。

為對(duì)象的屬性賦值的時(shí)候,只要賦值的數(shù)據(jù)的類型和屬性的類型一致就可以了变姨。但是族扰,這樣的賦值往往都不能隨意賦值。比如人的年齡為int類型定欧,我們賦值-10語(yǔ)法也不會(huì)報(bào)錯(cuò)渔呵。但這種賦值不符合實(shí)際情況,所以我們要為屬性賦值范圍加以限定忧额。

首先厘肮,實(shí)例變量一定不能被@public修飾,因?yàn)橐坏┍籃public修飾睦番,就能在外界通過(guò)對(duì)象名來(lái)訪問(wèn)這個(gè)實(shí)例變量类茂,隨意修改實(shí)例變量的值耍属。然后給實(shí)例變量提供兩種方法來(lái)供外界為實(shí)例變量賦值和訪問(wèn),也就是setter和getter方法巩检。只有g(shù)etter方法沒有setter方法叫只讀封裝厚骗,只有setter方法沒有g(shù)etter方法叫只寫封裝。

為類提供一種專門為實(shí)例變量賦值的方法 setter

1.這個(gè)方法一定是一個(gè)對(duì)象方法兢哭,因?yàn)橹挥袑?duì)象方法才能直接訪問(wèn)實(shí)例變量领舰。

2.這個(gè)方法一定沒有返回值,為實(shí)例變量賦值不需要返回值迟螺。

3.這個(gè)方法一定是有參數(shù)的冲秽,為實(shí)例變量賦值一定需要傳入一個(gè)和實(shí)例變量類型相同的參數(shù)。

4.這個(gè)方法的方法名以set開頭矩父,后面跟實(shí)例變量名去掉下劃線锉桑,并首字母大寫。

為類提供一種專門訪問(wèn)實(shí)例變量的值的方法 getter

1.這個(gè)方法一定是一個(gè)對(duì)象方法窍株,因?yàn)橹挥袑?duì)象方法才能直接訪問(wèn)實(shí)例變量民轴。

2.這個(gè)方法一定有返回值,供外界訪問(wèn)實(shí)例變量球订,必須要返回給調(diào)用者實(shí)例變量的值后裸。

3.這個(gè)方法一定沒有參數(shù),訪問(wèn)實(shí)例變量的值不需要傳入任何參數(shù)冒滩。

4.這個(gè)方法的方法名就是去掉下劃線的實(shí)例變量的名字微驶。

//Person.h文件

#import

@interface Person : NSObject

{

//不要給實(shí)例變量@public修飾

int _age;

}

//setter聲明

- (void)setAge:(int)age;

//getter聲明

- (int)age;

@end

//Person.m文件

#import "Person.h"

@implementation Person

//setter實(shí)現(xiàn)

- (void)setAge:(int)age{

//傳入的年齡在 0 - 120之間才能賦值,否則輸出提示

if(age > 0 && age < 120){

_age = age;

}else{

NSLog(@"年齡不符合");

}

}

//getter實(shí)現(xiàn)

- (int)age{

return _age;

}

@end

//main.m文件

#import

#import "Person.h"

int main(int argc, const char * argv[]) {

@autoreleasepool {

//實(shí)例化一個(gè)對(duì)象p

Person *p = [Person new];

//調(diào)用p對(duì)象setAge方法為對(duì)象的實(shí)例變量賦值

[p setAge:200];//因?yàn)椴环弦?guī)范,會(huì)打印出 年齡不符合

//輸出p對(duì)象的實(shí)例變量age的值

NSLog(@"age = %i",[p age]);//輸出 age = 0

}

return 0;

}

注意:

1.setter和getter方法的命名必須符合規(guī)范旦部。

2.實(shí)例變量無(wú)論如何都不能用@public修飾,不然就不符合封裝的理念祈搜。

3.只要實(shí)例變量要被外界訪問(wèn),都應(yīng)該為他封裝一個(gè)setter和getter方法士八。

六容燕、對(duì)象之間的關(guān)系

組合關(guān)系

一個(gè)類是由多個(gè)對(duì)象組合而成的(多個(gè)對(duì)象都是同一個(gè)類的實(shí)例變量),那么他們之間的關(guān)系就叫組合關(guān)系婚度。

依賴關(guān)系

一個(gè)方法的參數(shù)是另一個(gè)對(duì)象(依賴參數(shù)那個(gè)對(duì)象,沒有了參數(shù)就無(wú)法整了)蘸秘,那么他們之間的關(guān)系就是依賴關(guān)系。

關(guān)聯(lián)關(guān)系

當(dāng)一個(gè)對(duì)象擁有另外一個(gè)對(duì)象的時(shí)候(一個(gè)對(duì)象是另一個(gè)對(duì)象的實(shí)例變量蝗茁,但是他們并不是組合關(guān)系)醋虏,那么他們之間的關(guān)系就是關(guān)聯(lián)關(guān)系。

面向?qū)ο笤O(shè)計(jì)中:

耦合度? 當(dāng)修改一個(gè)對(duì)象的時(shí)候,對(duì)另外一個(gè)對(duì)象的影響程度

低耦合? 當(dāng)修改一個(gè)對(duì)象的對(duì)其他對(duì)象影響比較小

高內(nèi)聚? 一個(gè)對(duì)象僅僅做自己相關(guān)的事情

面向?qū)ο笤O(shè)計(jì)原則是高內(nèi)聚哮翘、低耦合颈嚼,單一職責(zé)原則

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末饭寺,一起剝皮案震驚了整個(gè)濱河市阻课,隨后出現(xiàn)的幾起案子叫挟,更是在濱河造成了極大的恐慌,老刑警劉巖限煞,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抹恳,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡署驻,警方通過(guò)查閱死者的電腦和手機(jī)奋献,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)旺上,“玉大人瓶蚂,你說(shuō)我怎么就攤上這事「Ч伲” “怎么了扬跋?”我有些...
    開封第一講書人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)凌节。 經(jīng)常有香客問(wèn)我,道長(zhǎng)洒试,這世上最難降的妖魔是什么倍奢? 我笑而不...
    開封第一講書人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮垒棋,結(jié)果婚禮上卒煞,老公的妹妹穿的比我還像新娘。我一直安慰自己叼架,他們只是感情好畔裕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著乖订,像睡著了一般扮饶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上乍构,一...
    開封第一講書人閱讀 51,215評(píng)論 1 299
  • 那天甜无,我揣著相機(jī)與錄音,去河邊找鬼哥遮。 笑死岂丘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的眠饮。 我是一名探鬼主播奥帘,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼仪召!你這毒婦竟也來(lái)了寨蹋?” 一聲冷哼從身側(cè)響起松蒜,我...
    開封第一講書人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钥庇,沒想到半個(gè)月后牍鞠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡评姨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年难述,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吐句。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡胁后,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嗦枢,到底是詐尸還是另有隱情攀芯,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布文虏,位于F島的核電站侣诺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏氧秘。R本人自食惡果不足惜年鸳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望丸相。 院中可真熱鬧搔确,春花似錦、人聲如沸灭忠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)弛作。三九已至涕蜂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缆蝉,已是汗流浹背宇葱。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刊头,地道東北人黍瞧。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像原杂,于是被迫代替她去往敵國(guó)和親印颤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

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

  • 為什么很多內(nèi)置類如UITableView的delegate屬性都是assign而不是retain? 所有的引用計(jì)數(shù)...
    煙雨平生花飛舞閱讀 1,193評(píng)論 0 3
  • 版權(quán)聲明:本文為博主原創(chuàng)文章穿肄,未經(jīng)博主允許不得轉(zhuǎn)載年局。 學(xué)習(xí)目標(biāo) 1.【了解】異常處理 2.【掌握】類方法 3.【掌...
    LeaderBiao閱讀 332評(píng)論 0 1
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法际看,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法矢否,繼承相關(guān)的語(yǔ)法仲闽,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 31,624評(píng)論 18 399
  • 我是
    小石頭456閱讀 116評(píng)論 0 0
  • 2月24日僵朗,我的一天之練完了啦啦操赖欣。 曾經(jīng)在星期二的時(shí)候教我們啦啦操的老師立下誓言,說(shuō)這個(gè)星期要交會(huì)我們?nèi)康睦怖?..
    Sernedipity閱讀 252評(píng)論 0 0