Objective-C學(xué)習(xí)筆記

最近在通過小碼哥的iOS開發(fā)教學(xué)視頻重新回顧復(fù)習(xí)OC的知識點。這篇文章用來記錄一下學(xué)習(xí)中的重點和心得阳掐,便于以后再進行回顧始衅,也可以讓其他初學(xué)者一起學(xué)習(xí)交流。


一缭保、Objective-C中的類與對象

1.類方法中不可以訪問屬性變量(因為還沒有創(chuàng)建類的對象實例觅闽,還不存在屬性變量的實例);


2.在對象方法中可以直接調(diào)用類方法涮俄。但是在類方法中不可直接調(diào)用對象方法(雖然可以間接調(diào)用蛉拙,但這樣做沒有實際意義,不建議這樣做)彻亲。


3.當(dāng)一個方法不需要使用類中的屬性變量時孕锄,能使用類方法最好使用類方法。因為類方法的執(zhí)行效率比對象方法更高:

調(diào)用對象方法時苞尝,需要先通過對象的指針訪問內(nèi)存中儲存對象數(shù)據(jù)的地址畸肆,并找到isa指針,再通過isa指針找到類對象中所對應(yīng)的目標(biāo)方法宙址;而調(diào)用類方法時不需要中間的兩部過程轴脐,而是直接訪問類對象中的目標(biāo)方法。因此類方法的執(zhí)行效率明顯高于對象方法抡砂。


4.通過類創(chuàng)建對象時大咱,返回的地址就是類的第0個屬性的地址。但是注益!但是類的第0個屬性不是手動創(chuàng)建的屬性碴巾,而是一個叫做isa的屬性。(isa是一個指針丑搔,指向這個實例對象所屬的類)


5.OC中點語法的本質(zhì)是編譯器特性厦瓢,編譯器自動將點語法轉(zhuǎn)換為getter或setter方法


6.關(guān)于self的用法:

在對象方法中提揍,self代表調(diào)用當(dāng)前對象方法的那個實例對象;在類方法中煮仇,self代表調(diào)用類方法的類劳跃。由編譯器自動區(qū)分

注意:不能在方法中通過self再次調(diào)用該方法,因為這會導(dǎo)致無限調(diào)用死循環(huán)浙垫。


7.繼承時售碳,方法可以重寫,但屬性(成員變量)不能重寫绞呈。


8.關(guān)于super的用法:

在對象方法中贸人,調(diào)用父類的對象方法;在類方法中佃声,調(diào)用父類的類方法艺智。且super可以在任意方法中調(diào)用父類的方法。

super一般用在重寫方法時圾亏,用來保留父類方法中的功能十拣。


9.什么是多態(tài)?

用父類的指針指向一個子類的對象志鹃,這就是多態(tài)夭问。其在編譯時表現(xiàn)為父類類型,在運行時表現(xiàn)為真實類型曹铃。


10.如果一個方法只有實現(xiàn)而沒有聲明缰趋,那么這個方法就是所謂的"私有方法"。(Objective-C中沒有真正的私有方法)


11.id和instancetype

1)id和instancetype都是動態(tài)類型陕见,但id在編譯時不知道其真實類型秘血,而instancetype在編譯時編譯器就可以判斷其真實類型。

2)instancetype只能用于作為返回值评甜,不能用來定義變量或作為形參灰粮;id則均可。

3)自定義構(gòu)造方法和工廠方法時忍坷,返回值應(yīng)該盡量使用instancetype而非id粘舟,以確保編譯器可以在編譯時檢查類型錯誤。

4)id的應(yīng)用場景:多態(tài)佩研「屉龋可以減少代碼量-避免調(diào)用子類特有的方法時進行強制類型轉(zhuǎn)換(但是要注意類型檢查,從而避免運行時錯誤)


12.工廠方法

0)工廠方法是用來快速創(chuàng)建實例對象的類方法韧骗;

1)一定是類方法嘉抒;

2)方法名稱以類名開頭,首字母小寫袍暴;

3)一定有返回值些侍,且返回值類型必須是instancetype或id

4)工廠方法最好與對象構(gòu)造方法一一對應(yīng)。

ex:需要注意的是政模,在工廠方法中岗宣,創(chuàng)建對象的語句不要用類名來創(chuàng)建(即類似于[[Something alloc] init]的形式),而是應(yīng)該使用self來創(chuàng)建(類似于[[self alloc] init]的形式)淋样。這樣可以避免子類調(diào)用父類的工廠方法時創(chuàng)建了一個父類的對象耗式,導(dǎo)致運行時錯誤。


13.類的本質(zhì)

1)類本質(zhì)上也是一個對象趁猴。類對象在第一次被使用時創(chuàng)建刊咳;

2)類對象中儲存著類的屬性和對象方法。類對象中有一個isa指針儡司,指向一個元類對象娱挨;

3)元類對象中儲存著類的類方法。元類對象中有一個isa指針捕犬,指向一個根元類對象(也就是NSObject的元類對象)跷坝;

4)根元類對象中儲存著類的new方法。根元類對象中有一個指向自身的isa指針碉碉。


14.類的啟動過程

1)當(dāng)程序啟動時柴钻,所有類的代碼會被加載到內(nèi)存中的代碼區(qū),并且自動調(diào)用每個類的+load方法垢粮。如果需要對程序啟動時進行一些一次性的配置贴届,可以重寫類的該方法。

2)當(dāng)一個類首次被使用時蜡吧,會調(diào)用一次+initialize方法粱腻,并且在整個程序運行期間只會調(diào)用一次≌兜可以重寫這個方法來對某一個類進行一次性的初始化绍些。

3)如果存在繼承關(guān)系,會先調(diào)用父類的+load和+initialize方法耀鸦,再調(diào)用子類的方法柬批。


15.SEL類型

SEL類型通過@seletor方式接受一個方法名創(chuàng)建,有以下3個左右:

1)通過-responsToSeletor:方法來檢查對象/類是否實現(xiàn)了某個方法袖订;

2)通過-performSelecor:可以配合對象/類來調(diào)用一個方法氮帐;(如果需要傳參數(shù),可以增加withObject:來實現(xiàn)洛姑,但是最多只能傳2個參數(shù))

3)配合對象將SEL類型的對象作為一個方法的參數(shù)來傳遞上沐,從而實現(xiàn)方法。


16.文件編寫規(guī)范

在.h中盡量使用@class來聲明會用到的類楞艾,而不是用#import導(dǎo)入類文件参咙;而在.m文件中才用#import導(dǎo)入類的頭文件來獲取聲明龄广。可以極大的提高編譯的效率蕴侧。(因為可以避免文件的改動導(dǎo)致的大量連鎖重新導(dǎo)入)



二择同、Objective-C的內(nèi)存管理

1.MRC和ARC

MRC(Manul Reference Counting),即手動引用計數(shù)净宵。程序中創(chuàng)建的對象都需要程序員自行管理敲才,手動釋放。

MRC中內(nèi)存管理的機制:通過引用計數(shù)器確定對象釋放應(yīng)當(dāng)釋放內(nèi)存择葡。對象創(chuàng)建時引用計數(shù)為1紧武,僅當(dāng)引用計數(shù)為0時,系統(tǒng)自動釋放敏储。

ARC(Automatic Reference Counting)阻星,即自動引用計數(shù)。是Apple在2011年iOS5時引入一種自動管理內(nèi)存的機制虹曙,可以自動幫助程序員管理程序中創(chuàng)建的對象迫横,在恰當(dāng)?shù)臅r機自動釋放。

ARC中內(nèi)存管理的機制:通過程序中指向?qū)ο蟮膹娭羔様?shù)量來確定對象是否應(yīng)當(dāng)釋放酝碳。只要有強指針指向?qū)ο笏诘膬?nèi)存空間矾踱,則不會釋放內(nèi)存。當(dāng)沒有強指針指向?qū)ο髸r疏哗,對象被銷毀呛讲,內(nèi)存空間被釋放。

注意:ARC本質(zhì)上是一種編譯器特性返奉,是有編譯器在代碼中適當(dāng)?shù)牡胤阶詣訋统绦騿T添加retain和release代碼贝搁。與Java中系統(tǒng)定時進行垃圾清理的機制有本質(zhì)區(qū)別。


2.野指針

在MRC中芽偏,當(dāng)一個對象被釋放后雷逆,指向這塊內(nèi)存空間的指針就變成了野指針。當(dāng)給一個野指針發(fā)送消息時污尉,會導(dǎo)致運行時錯誤(因為已經(jīng)被釋放的對象中沒有方法)膀哲。通常可以在對象被釋放后將原本指向其內(nèi)存空間的指針置為空指針來避免該問題被碗。因為OC中對空指針發(fā)送消息不會有任何問題某宪,也不會做任何事情。


3.內(nèi)存管理準(zhǔn)則

MRC中的內(nèi)存管理遵循:誰創(chuàng)建誰釋放锐朴、誰retain誰release兴喂、誰copy誰release。也就是說只要有一次使對象的引用計數(shù)+1的行為,就必須對應(yīng)一次release即可衣迷。


4.自動釋放池

@autoreleasepool的機制是當(dāng)pool被銷毀時畏鼓,自動向池中的每一個對象發(fā)送一條release消息。對對象調(diào)用autorelease方法可以將對象加入到棧頂?shù)淖詣俞尫懦刂小?/p>

由于自動釋放池本質(zhì)上是延遲釋放蘑险,因此最好不要在池中保存占用內(nèi)存很大的對象滴肿,也不要在池中放入次數(shù)很大的循環(huán)操作岳悟,避免在池銷毀前占用的內(nèi)存過大佃迄。


5.弱指針

__weak關(guān)鍵字修飾的指針是弱指針。弱指針指向的對象的釋放不受弱指針的影響贵少。即:即使還有弱指針指向?qū)ο蠛乔危灰獩]有強指針指向了對象,對象還是會被自動釋放滔灶。

但弱指針?biāo)傅膶ο笕绻会尫帕似账椋踔羔槙蛔詣又脼閚il。合理的使用弱指針可以有效的避免野指針的情況录平。



三麻车、Category(分類、類別)

Category是OC特有的語法斗这,是對類的擴展动猬,用于擴充已有類的方法。


1.Category的優(yōu)勢

1)可以在不修改原有類的基礎(chǔ)上表箭,擴充類的方法

2)可以把一個龐大的類分模塊來開發(fā)赁咙,減少一份文件中的代碼量,提高代碼的結(jié)構(gòu)性和可讀性免钻。

3)可以便于多人開發(fā)彼水,方便多人同時開發(fā)一個類。


2.注意點

1)只能添加方法极舔,不能添加屬性(成員變量)

2)如果在分類中使用@property凤覆,只會生成setter和getter方法的聲明,不會生成實現(xiàn)代碼拆魏,也不會添加成員變量盯桦。

3)如果分類中有和原有類中同名的方法,會調(diào)用分類中的方法稽揭,忽略原有類中的方法俺附。如果多個分類中有同名的方法,則調(diào)用時調(diào)用的是最后編譯的那個分類中的方法溪掀。(主要不要這樣寫事镣!這樣寫代碼的可讀性和可維護性極低!)



四、Block

Block是一種數(shù)據(jù)類型璃哟,可以保存一段代碼氛琢,在恰當(dāng)?shù)臅r候取出來調(diào)用。


1.注意點

1)block可以訪問外部變量随闪,用到的變量是一份拷貝(值傳遞)

2)block可以定義和外部同名的變量阳似,會覆蓋外部的定義。

3)默認(rèn)情況下不可以在block中修改外部變量的值铐伴,如果需要修改撮奏,則需要將給外部變量加上__block關(guān)鍵字。(傳遞地址)

4)block默認(rèn)在棧中当宴,對block進行copy后會轉(zhuǎn)移到堆中



五畜吊、@property的修飾符

@property共有以下關(guān)鍵字:

1)readonly/readwrite:分別代表只讀或可讀寫。用readonly修飾的屬性只會生成getter方法户矢。用readwrite修飾的屬性則getter方法和setter方法都會生成

2)atomic/nonatomic:分別代表線程安全和非線程安全玲献。 用atomic修飾的屬性在多線程編程中是線程安全的,但執(zhí)行效率低梯浪。用nonatomic修飾的屬性不安全捌年,但執(zhí)行效率高。在iOS開發(fā)中通常使用nonatomic挂洛。

3)retain/assign:在MRC中使用礼预。assign表示僅賦值,不自動添加retain抹锄、release代碼逆瑞,通常對基本數(shù)據(jù)類型的屬性使用。retain表示讓編譯器自動添加retain伙单、release代碼获高,通常對對象屬性使用。

4)strong/weak/assign:在ARC中使用吻育。strong表示用強指針指向該成員變量念秧,大部分對象類型用該修飾符。weak表示弱指針指向成員變量布疼,以避免循環(huán)引用的情況摊趾,通常用在UI中的子控件。assign與MRC中相同游两,通常用于基本數(shù)據(jù)類型砾层。

5)copy:表示該屬性將通過copy的方式創(chuàng)建。常用于NSString贱案、NSArray肛炮、NSDictionary這些擁有可變版本的類,用來避免外部變量的修改導(dǎo)致成員變量的改變。



六侨糟、protocol

protocol(協(xié)議)是儲存方法的聲明碍扔,用來表示某個類型的對象需要實現(xiàn)某些方法。協(xié)議僅僅用于程序員之間的交流秕重,只會引起編譯器警告不同,不會報錯。


1.應(yīng)用場景:

1)將協(xié)議寫在數(shù)據(jù)類型右邊溶耘,作為類型限定二拐,表明賦值時,對象必須遵守了該協(xié)議汰具。

2)在代理設(shè)計模式中使用卓鹿。


2.注意點:

1)只能聲明方法菱魔,不能聲明屬性留荔;

2)父類遵守了某協(xié)議,則子類也遵守該協(xié)議澜倦;

3)一個類可以遵守多個協(xié)議聚蝶;

4)協(xié)議也可以繼承其他協(xié)議,書寫方式與類繼承類似藻治。


3.協(xié)議編寫規(guī)范:

1)一般情況下碘勉,協(xié)議屬于誰,就將協(xié)議定義到誰的頭文件中桩卵;

2)協(xié)議名稱一般以類名開頭验靡,跟上protocol或delegate;

3)協(xié)議中的方法一般以類名為前綴雏节;

4)一般情況下胜嗓,類中代理屬性的名稱都是delegate;

5)在.h文件中用@protocol+協(xié)議名稱來聲明協(xié)議钩乍,在.m文件中再用#import導(dǎo)入?yún)f(xié)議的.h文件辞州。可以提高編譯效率

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寥粹,一起剝皮案震驚了整個濱河市变过,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌涝涤,老刑警劉巖媚狰,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異阔拳,居然都是意外死亡崭孤,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來裳瘪,“玉大人土浸,你說我怎么就攤上這事∨砀” “怎么了黄伊?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長派殷。 經(jīng)常有香客問我还最,道長,這世上最難降的妖魔是什么毡惜? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任拓轻,我火速辦了婚禮,結(jié)果婚禮上经伙,老公的妹妹穿的比我還像新娘扶叉。我一直安慰自己,他們只是感情好帕膜,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布枣氧。 她就那樣靜靜地躺著,像睡著了一般垮刹。 火紅的嫁衣襯著肌膚如雪达吞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天荒典,我揣著相機與錄音酪劫,去河邊找鬼。 笑死寺董,一個胖子當(dāng)著我的面吹牛覆糟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播螃征,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼搪桂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了盯滚?” 一聲冷哼從身側(cè)響起踢械,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎魄藕,沒想到半個月后内列,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡背率,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年序矩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片车遂。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡缰冤,死狀恐怖男窟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布处坪,位于F島的核電站,受9級特大地震影響架专,放射性物質(zhì)發(fā)生泄漏同窘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一部脚、第九天 我趴在偏房一處隱蔽的房頂上張望想邦。 院中可真熱鬧,春花似錦委刘、人聲如沸丧没。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽骂铁。三九已至,卻和暖如春罩抗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背灿椅。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工套蒂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人茫蛹。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓操刀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親婴洼。 傳聞我的和親對象是個殘疾皇子骨坑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

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