簡(jiǎn)略記錄部分概念丸相,后期有時(shí)間會(huì)針對(duì)性的另開新篇苍在。
.m擴(kuò)展名闻葵?
Xcode通過(guò).m擴(kuò)展名來(lái)表示文件使用的是Objective-C代碼情龄,應(yīng)該由Objective-C編譯器處理迄汛。例如C編譯器處理.c文件,C++編譯器處理.cpp文件骤视。
#import語(yǔ)句鞍爱?
Objective-C使用頭文件來(lái)包含結(jié)構(gòu)體、符號(hào)常量和函數(shù)原型等元素的申明专酗,#import可保證頭文件只被包含一次睹逃,無(wú)論該命令在該文件中出現(xiàn)多少次。例如#import<Foundation/Foundation.h>語(yǔ)句告訴編譯器查找Foundation框架中的Foundation.h頭文件祷肯。Xcode使用預(yù)編譯頭文件來(lái)加快讀取速度沉填,通過(guò)#import導(dǎo)入文件時(shí)加載速度很快,同時(shí)在編譯時(shí)會(huì)將該類的頭文件中的所有信息都引入佑笋。
@class翼闹?
@class創(chuàng)建了一個(gè)向前引用,告訴編譯器有這樣一個(gè)類蒋纬,并不會(huì)引入該類的其他信息猎荠。
框架坚弱?
框架是一種把頭文件、庫(kù)关摇、圖片史汗、聲音等內(nèi)容聚集在一個(gè)獨(dú)立單元中的集合體。每一個(gè)框架都有一個(gè)主頭文件拒垃,它包含了框架中所有的頭文件停撞。通過(guò)在頭文件中使用#import,就可以訪問(wèn)框架內(nèi)的所有功能悼瓮。
NSLog()戈毒?
NSLog()接受一個(gè)字符串作為其第一個(gè)參數(shù),該字符串可以包含格式說(shuō)明符(eg:d%),接受與格式說(shuō)明符相匹配的參數(shù)横堡,NSLog本質(zhì)上就是具有Cocoa特色的printf()函數(shù)埋市。
@%?
NSLog()可以使用@%格式說(shuō)明符來(lái)輸出對(duì)象命贴,NSLog()處理@%說(shuō)明符時(shí)道宅,會(huì)詢問(wèn)參數(shù)列表中相應(yīng)的對(duì)象以得到這個(gè)對(duì)象的描述。從技術(shù)上講胸蛛,也就是NSLog()給這個(gè)對(duì)象發(fā)送了description消息污茵,然后對(duì)象的description方法生成一個(gè)NSString并將其返回,NSLog()就會(huì)在輸出結(jié)果中包含這個(gè)字符串葬项。@%只是調(diào)用每個(gè)對(duì)象的description方法并顯示結(jié)果泞当,在類中提供description方法就可以自定義NSLog()會(huì)如何輸出對(duì)象
NS前綴?
Cocoa下的所有函數(shù)民珍、常量和類型名稱都添加了NS前綴襟士,這個(gè)前綴代表創(chuàng)建的內(nèi)容屬于Cocoa。1985年喬布斯創(chuàng)立了Next公司嚷量,Next公司以Unix作為操作系統(tǒng)并創(chuàng)建了NextSTEP(使用Objective-C語(yǔ)言開發(fā)的一款功能強(qiáng)大的用戶界面工具包)陋桂,蘋果公司在1996年收購(gòu)Next公司之后NextSTEP更名為Cocoa,Cocoa下NS的前綴實(shí)際來(lái)源于NextSTEP蝶溶。
字符串用@嗜历?
NSLog(@"Hello,Objective-C");
@符號(hào)是Objective-C在標(biāo)準(zhǔn)C語(yǔ)言基礎(chǔ)上添加的特性之一,@符號(hào)表明引號(hào)內(nèi)的字符串內(nèi)容應(yīng)作為Cocoa下的NSString元素來(lái)處理身坐。
return 0秸脱?
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
}
return 0;
}
程序中最后一行是返回語(yǔ)句,它可以終止main()函數(shù)的執(zhí)行并結(jié)束程序部蛇,return 0;
意味著這個(gè)程序成功的執(zhí)行完了摊唇。
bool,BOOL涯鲁?
bool是C語(yǔ)言的布爾數(shù)據(jù)類型具有true與false兩個(gè)值巷查,BOOL是Objective-C的布爾數(shù)據(jù)類型具有YES與NO兩個(gè)值有序。BOOL實(shí)際上是一種對(duì)帶符號(hào)的字符類型(signed char)的類型定義,使用8位的存儲(chǔ)空間岛请,通過(guò)#define指令把YES定義為1旭寿,NO定義為0。Objective-C不會(huì)將BOOL作為只能保存YES和NO值的真正布爾類型來(lái)處理崇败,編譯器將BOOL認(rèn)作8位的二進(jìn)制數(shù)盅称,當(dāng)將一個(gè)非0非1的數(shù)賦給BOOL變量時(shí),只有低位字節(jié)會(huì)作用BOOL值后室。即在signed char的范圍內(nèi)-128到+127之間只有0是NO缩膝,非0是YES;(切記岸霹,不要將BOOL值和YES直接進(jìn)行比較疾层,直接與NO值比較一定是安全的,因?yàn)镃語(yǔ)言中的假值只有一個(gè)0)
面向?qū)ο螅?/h5>
面向?qū)ο缶幊蹋∣bject-Oriented Programming)的首字母縮寫為OOP贡避,是一種編程架構(gòu)痛黎,可構(gòu)建由多個(gè)對(duì)象組成的軟件。
變量與間接刮吧?
變量就是指通過(guò)變量名訪問(wèn)湖饱,它的值是可變的;
間接就是指在代碼中通過(guò)指針間接獲取某個(gè)值皇筛,而不是直接獲取琉历,間接是OOP的核心坠七,OOP使用間接來(lái)調(diào)用代碼水醋,而不是直接調(diào)用函數(shù)。
過(guò)程式編程彪置?
過(guò)程式編程建立在函數(shù)之上拄踪,數(shù)據(jù)為函數(shù)服務(wù),就是分析出解決問(wèn)題所需要的步驟拳魁,然后用函數(shù)把這些步驟一步一步實(shí)現(xiàn)惶桐,使用的時(shí)候一個(gè)一個(gè)依次調(diào)用。
面向?qū)ο缶幊蹋?/h5>
面向?qū)ο缶幊桃猿绦虻臄?shù)據(jù)為中心潘懊,函數(shù)為數(shù)據(jù)服務(wù)姚糊,數(shù)據(jù)通過(guò)間接方式引用代碼,代碼可以對(duì)數(shù)據(jù)進(jìn)行操作授舟。
id救恨?
id是一種泛型,可以用來(lái)引用任何類型的對(duì)象释树。
[class new]; 方括號(hào)肠槽?
在Objective-C中方括號(hào)還表示:用于通知某個(gè)對(duì)象該去做什么擎淤,方括號(hào)里第一項(xiàng)是對(duì)象,其余部分是需要對(duì)象執(zhí)行的操作秸仙。通知對(duì)象執(zhí)行某種操作稱為發(fā)送消息嘴拢,也叫調(diào)用方法。
類寂纪?
類是一種能夠?qū)嵗蓪?duì)象的結(jié)構(gòu)體席吴。對(duì)象通過(guò)它的類來(lái)獲取自身的各種信息。在Objective-C編程時(shí)采用首字母大寫的類名捞蛋。
對(duì)象抢腐?
對(duì)象是一種包含值和指向其類的隱藏指針的結(jié)構(gòu)體,指向?qū)ο蟮淖兞客ǔ2恍枰鬃帜复髮懡蠼弧T贠bjective-C中所有對(duì)象的交互都是通過(guò)指針來(lái)實(shí)現(xiàn)的迈倍。
實(shí)例?
實(shí)例是“對(duì)象”的另一種稱呼捣域。
消息啼染?
消息是對(duì)象可以執(zhí)行的操作,用于通知對(duì)象去做什么焕梅,對(duì)象接收到消息后迹鹅,將查詢相應(yīng)的類,找到正確的代碼來(lái)運(yùn)行贞言。
方法斜棚?
方法是為響應(yīng)消息而運(yùn)行的代碼。根據(jù)對(duì)象的類该窗,消息可以調(diào)用不同的方法弟蚀。
接口?
接口是類為對(duì)象提供的特性描述酗失。
實(shí)現(xiàn)义钉?
實(shí)現(xiàn)是使接口可以正常工作的代碼。
UML规肴?
UML是一種用圖表表示類捶闸、類的內(nèi)容以及它們之間關(guān)系的常見(jiàn)方式。
實(shí)例化對(duì)象拖刃?
用類創(chuàng)建對(duì)象的過(guò)程稱為實(shí)例化删壮,實(shí)例化對(duì)象時(shí)需要分配內(nèi)存,然后將這些內(nèi)存初始化并保存為有用的默認(rèn)值兑牡,內(nèi)存分配和初始化工作完成之后央碟,就意味著新的對(duì)象實(shí)例已經(jīng)創(chuàng)建好了,創(chuàng)建一個(gè)新的對(duì)象发绢,需要向相應(yīng)的類發(fā)送new消息硬耍,該類接收并處理完new消息后就可以得到一個(gè)可以使用的新對(duì)象實(shí)例垄琐。
開放/關(guān)閉原則?
軟件實(shí)體應(yīng)該對(duì)擴(kuò)展開放经柴,而對(duì)修改關(guān)閉狸窘。(面向?qū)ο缶幊檀髱烞ertrand Meyer)
self?
每個(gè)方法調(diào)用都包括一個(gè)名為self的隱藏參數(shù),它是一個(gè)指向接收消息的對(duì)象的指針坯认,是對(duì)象自身翻擒。使用self參數(shù)后,方法可以查找并操作對(duì)象的數(shù)據(jù)牛哺。
繼承陋气?
表示一個(gè)類從另一個(gè)類(它的父類或超類)中獲取了某些特性。
方法調(diào)度引润?
方法調(diào)度是Objective-C使用的一種機(jī)制巩趁,用于推測(cè)執(zhí)行什么方法以響應(yīng)某個(gè)特定的消息。當(dāng)代碼發(fā)送消息時(shí)淳附,Objective-C的方法調(diào)度機(jī)制將在當(dāng)前的類中搜索相應(yīng)的方法议慰,如果無(wú)法在接收消息的對(duì)象的類中找到相應(yīng)的方法,就會(huì)在該對(duì)象的超類中進(jìn)行查找奴曙,逐步在繼承鏈中的每一個(gè)類中重復(fù)的查找别凹,如果在最頂層的NSObject類中也沒(méi)有找到相應(yīng)的方法,則會(huì)出現(xiàn)一個(gè)運(yùn)行時(shí)的報(bào)錯(cuò)洽糟。
實(shí)例變量炉菲?
在創(chuàng)建一個(gè)新類時(shí),其對(duì)象首先會(huì)從它的超類中繼承實(shí)例變量坤溃,然后根據(jù)自身情況添加自己的實(shí)例變量拍霜。
基地址加偏移?
編譯器使用“基地址加偏移”的機(jī)制查找存儲(chǔ)變量的位置浇雹。對(duì)象基地址即第一個(gè)實(shí)例變量的首個(gè)字節(jié)在內(nèi)存中的位置沉御,再在該地址上加上偏移地址,編譯器就可以查找其他實(shí)例變量的位置昭灵。
方法重寫?
子類實(shí)現(xiàn)父類的某一個(gè)方法伐谈,即重寫父類的方法烂完,方法調(diào)度機(jī)制將運(yùn)行重寫后的方法,父類中定義的方法實(shí)現(xiàn)將被忽略诵棵。
super抠蚣?
為了調(diào)用繼承的方法在父類中的實(shí)現(xiàn),需要使用super作為方法調(diào)用的目標(biāo)履澳。super既不是參數(shù)也不是實(shí)例變量嘶窄,是由Objective-C編譯器提供的一種功能怀跛,當(dāng)你向super發(fā)送消息時(shí),實(shí)際上是在向該類的超類發(fā)送消息柄冲,如果超類中沒(méi)有定義該消息吻谋,會(huì)繼續(xù)在繼承鏈上一級(jí)中查找。調(diào)用繼承的方法可以確保獲得方法實(shí)現(xiàn)的所有特性
復(fù)合现横?
對(duì)象引用其他對(duì)象時(shí)漓拾,可以利用其他對(duì)象提供的特性,這就是復(fù)合戒祠。在Objective-C中骇两,復(fù)合是通過(guò)包含作為實(shí)例變量的對(duì)象指針實(shí)現(xiàn)的。
if (self = [super init]) 姜盈?
if (self = [super init]) {
為了讓超類將所有需要的初始化工作一次性完成低千,需要調(diào)用[super init],init返回的值就是被初始化的對(duì)象馏颂,將[super init]返回的結(jié)果賦給self是Objective-C的慣例栋操,這么做是為了防止超類在初始化過(guò)程中返回的對(duì)象與一開始創(chuàng)建的不一致。self參數(shù)是通過(guò)固定的距離尋找實(shí)例變量所在的內(nèi)存位置的饱亮,如果init方法返回一個(gè)新對(duì)象則需要更新self矾芙,以便其后的實(shí)例變量的引用可以被映射到正確的內(nèi)存位置,這也是需要使用self = [super init]這種形式賦值的原因近上,這個(gè)賦值操作只影響該init方法中self的值剔宪,而不影響該方法范圍以外的任何內(nèi)容。如果從[super init]返回的值是nil壹无,則 if (self = [super init]) 的判斷不會(huì)讓主體代碼執(zhí)行葱绒。
存取方法?
存取方法是用來(lái)讀取或改變某個(gè)對(duì)象屬性的方法斗锭,分為setter方法和getter方法地淀。setter方法通過(guò)給對(duì)象指針發(fā)送該消息(調(diào)用setter方法)修改內(nèi)部屬性值。getter方法用代碼通過(guò)對(duì)象自身訪問(wèn)對(duì)象屬性岖是。存取方法一般是成對(duì)出現(xiàn)的帮毁,一個(gè)用來(lái)設(shè)置屬性的值,另一個(gè)用來(lái)讀取屬性的值豺撑。有時(shí)只有一個(gè)getter方法用于只讀屬性烈疚,或者只有一個(gè)setter方法(如修改密碼)也是合理的。setter方法根據(jù)它所更改的屬性的名稱來(lái)命名并加上前綴set聪轿,getter方法則是以其返回的屬性名稱來(lái)命名爷肝。不要將get用作getter方法的前綴
Foundation?
Foundation是兩類UI框架的基礎(chǔ),它不包含UI對(duì)象。Foundation框架中有很多有用的灯抛、面向數(shù)據(jù)的簡(jiǎn)單類和數(shù)據(jù)類型对嚼,F(xiàn)oundation框架是以另一個(gè)框架CoreFoundation為基礎(chǔ)創(chuàng)建的兔朦,CoreFoundation框架是用純C語(yǔ)言寫的沽甥。
類方法摆舟?
Objective-C運(yùn)行時(shí)生成一個(gè)類時(shí),會(huì)創(chuàng)建一個(gè)代表該類的類對(duì)象照宝,在聲明方法時(shí)使用“+”厕鹃,就是把這個(gè)方法定義為類方法剂碴,這個(gè)方法屬于類對(duì)象(而不是類的實(shí)例對(duì)象)轻专。
內(nèi)存泄漏请垛?
必須確保在需要的時(shí)候分配內(nèi)存叼屠,在程序結(jié)束運(yùn)行的時(shí)候釋放占用的內(nèi)存,如果只分配而不釋放內(nèi)存,則會(huì)發(fā)生內(nèi)存泄漏挑宠,程序的內(nèi)存占用量不斷增加各淀,最終會(huì)被耗盡并導(dǎo)致程序崩潰。(不要使用任何剛釋放的內(nèi)存奴璃,可能誤用陳舊數(shù)據(jù),引發(fā)錯(cuò)誤
)
對(duì)象所有權(quán)雳旅?
如果一個(gè)對(duì)象內(nèi)有指向其他對(duì)象的實(shí)例變量攒盈,則稱該對(duì)象擁有這些對(duì)象,如果一個(gè)函數(shù)創(chuàng)建了一個(gè)對(duì)象哎榴,則稱該函數(shù)擁有這個(gè)對(duì)象。
垃圾回收偷遗?
Objective-C2.0引入了自動(dòng)內(nèi)存管理機(jī)制,也稱垃圾回收驼壶。(只支持OS X應(yīng)用開發(fā),無(wú)法用在iOS應(yīng)用程序上)
自動(dòng)引用計(jì)數(shù)热凹?
自動(dòng)引用計(jì)數(shù)(automatic reference counting,ARC)泵喘,ARC不是垃圾回收器般妙,在編譯時(shí)進(jìn)行工作碟渺,適時(shí)插入retain和release語(yǔ)句旺隙,完成內(nèi)存管理的工作,ARC是一個(gè)可選的功能,必須明確的啟用或禁用它周拐;ARC只對(duì)可保留的對(duì)象指針有效,主要包括:1.代碼塊指針 2.Objective-C對(duì)象指針 3.通過(guò) _attribute____((NSObject))類型定義的指針凰兑。(所有其他的指針類型如char* 和 CFStringReg不支持ARC特性妥粟,必須手動(dòng)管理)
弱引用?
屬性使用了assign特性便是創(chuàng)建了一個(gè)弱引用聪黎,弱引用有助于處理保留循環(huán)罕容,使用弱引用計(jì)數(shù)器的值不會(huì)增加。
歸零弱引用稿饰?
讓對(duì)象自己去清空弱引用的對(duì)象锦秒,在指向的對(duì)象釋放后,弱引用就會(huì)被設(shè)置為nil喉镰,這種特殊的弱引用稱為歸零弱引用旅择。有兩種方式申明歸零弱引用:使用__weak關(guān)鍵字或?qū)傩允褂脀eak屬性。侣姆,__unsafe_unretained關(guān)鍵字和unsafe_unretained特性也可以指定引用是弱引用生真。
使用ARC時(shí),屬性名稱不能以new開頭捺宗,屬性不能只有一個(gè)read-only而沒(méi)有內(nèi)容管理特性柱蟀,內(nèi)存管理的關(guān)鍵字和特性是不能一起使用的,兩者互相排斥蚜厉。
異常长已?
異常就是意外事件,如數(shù)組溢出昼牛,當(dāng)發(fā)生異常時(shí)术瓮,程序會(huì)創(chuàng)建一個(gè)異常對(duì)象,Cocoa中使用NSException類來(lái)表示異常贰健,Cocoa要求所有的異常必須是NSexception類型的異常胞四,其他對(duì)象拋出異常Cocoa不會(huì)處理。異常處理的目的是處理程序中的錯(cuò)誤伶椿,Cocoa框架的處理方式是程序退出辜伟。
異常的所有關(guān)鍵字都是以@開頭:
@try:代碼塊是否拋出異常氓侧;
@catch:處理已拋出異常的代碼塊,接收一個(gè)參數(shù)游昼,通常是NSException類型甘苍;
@finally:無(wú)論是否拋出異常尝蠕,最終會(huì)執(zhí)行的地方烘豌;
@throw:拋出異常;
異常會(huì)對(duì)程序資源有影響看彼,對(duì)一般的流程不能使用異常簡(jiǎn)單地標(biāo)記錯(cuò)誤廊佩,雖然使用@try建立異常不會(huì)產(chǎn)生消耗,但是捕捉異常會(huì)消耗大量資源并影響程序運(yùn)行的速度靖榕。
拋出異常标锄?
程序會(huì)創(chuàng)建一個(gè)NSException實(shí)例使用兩種方式來(lái)拋出異常,
使用“@throw異常名”語(yǔ)句來(lái)拋出異常茁计,向某個(gè)NSException對(duì)象發(fā)送raise消息料皇;
raise只對(duì)NSException對(duì)象有效,而@throw可以用在其他對(duì)象上星压。
對(duì)象初始化践剂?
通常有兩種方式創(chuàng)建對(duì)象,第一種[類名 new]娜膘,第二種[[類名 alloc] init]逊脯,這兩種方法是等價(jià)的,但是Cocoa慣例是使用alloc和init而不使用new竣贪。對(duì)象初始化分為兩個(gè)步驟军洼,第一步分配對(duì)象,第二步初始化對(duì)象演怎。
分配就是從操作系統(tǒng)中獲得一塊內(nèi)存匕争,并將其指定為存放對(duì)象的實(shí)例變量的位置。向類發(fā)送alloc消息就能為類分配一塊足夠大的內(nèi)存爷耀,以存放該類的全部實(shí)例變量甘桑,同時(shí)alloc方法還會(huì)將這塊內(nèi)存區(qū)域全部初始化為0。
初始化是從操作系統(tǒng)取得一塊內(nèi)存用于存儲(chǔ)對(duì)象畏纲,init方法一般返回其正在初始化的對(duì)象扇住。
在執(zhí)行初始化工作時(shí)包括給實(shí)例變量賦值并創(chuàng)建對(duì)象進(jìn)行工作時(shí)所需的其他對(duì)象。
初始化函數(shù)的一般規(guī)則是盗胀,假如你對(duì)象必須要用某些信息進(jìn)行初始化艘蹋,那么你應(yīng)該講這些信息作為init方法的一部分添加進(jìn)來(lái),這些事典型的不可變對(duì)象票灰。
@property?
@property預(yù)編譯指令的作用是自動(dòng)聲明屬性的setter和getter方法女阀,事實(shí)上屬性的名稱不必與實(shí)例變量的名稱相同宅荤,但大多數(shù)情況下是一樣的。
@synthesize 浸策?
一種新的編譯器功能冯键,表示創(chuàng)建了該屬性的訪問(wèn)代碼。不同于代碼生成庸汗,看不到實(shí)現(xiàn)的setter和getter方法惫确,但是這些方法是存在的并且可以調(diào)用。
@dynamic蚯舱?
不生成任何代碼或創(chuàng)建相應(yīng)的實(shí)例變量改化。
點(diǎn)表達(dá)式?
點(diǎn)表達(dá)式只是調(diào)用訪問(wèn)方法的一種便捷方式枉昏,無(wú)特殊之處陈肛。如果點(diǎn)表達(dá)式出現(xiàn)在等號(hào)的左邊表示該變量名稱的setter方法將被調(diào)用,如果如果點(diǎn)表達(dá)式出現(xiàn)在等號(hào)的右邊表示該變量名稱的getter方法將被調(diào)用兄裂。
類別句旱?
類別是一種為現(xiàn)有的類添加新方法的方式∥保可以在類別中添加屬性谈撒,但是不能添加實(shí)例變量,而且屬性必須是@dynamic類型的畅涂,添加屬性的好處在于你可以通過(guò)點(diǎn)表達(dá)式來(lái)訪問(wèn)setter和getter方法港华。類別可以訪問(wèn)其繼承的類的實(shí)例變量;類別有兩個(gè)局限性午衰,
- 第一個(gè)是無(wú)法向類別添加新的實(shí)例變量立宜,類別沒(méi)有空間容納實(shí)例變量;
- 第二個(gè)就是名稱沖突臊岸,就是類別中的方法與初始類的方法重名時(shí)橙数,類別的方法具有更高的優(yōu)先級(jí),會(huì)完全取代初始類方法帅戒,導(dǎo)致初始類方法不可用灯帮。
類別主要有三個(gè)用處,
- 將類的實(shí)現(xiàn)分散到多個(gè)不同的文件或框架中逻住;
- 創(chuàng)建對(duì)私有方法的向前引用钟哥;
- 向?qū)ο筇砑臃钦絽f(xié)議。
類擴(kuò)展瞎访?
類擴(kuò)展腻贰,一種特殊的類別。具有以下特點(diǎn):
- @interface部分不需要名字扒秸;
- 可以在包含的初始類中使用播演;
- 可以添加實(shí)例變量冀瓦;
- 沒(méi)有有獨(dú)立的實(shí)現(xiàn)部分(@implementation部分),所聲明的方法必須依托對(duì)應(yīng)初始類來(lái)實(shí)現(xiàn)写烤;
- 可以將只讀權(quán)限改為可讀寫的權(quán)限翼闽;
- 創(chuàng)建數(shù)量不限;
選擇器洲炊?
選擇器只是一個(gè)方法名稱感局,以O(shè)bjective-C運(yùn)行時(shí)使用的特殊方式編碼,以快速執(zhí)行查詢选浑±堆幔可以使用@selector()編譯指令括號(hào)中的方法名稱來(lái)指定選擇器。選擇器可以被傳遞古徒,可以作為方法的參數(shù)使用,甚至可以作為實(shí)例變量被存儲(chǔ)读恃。
非正式協(xié)議隧膘?
非正式協(xié)議是NSObject的一個(gè)類別,它列出了對(duì)象可以響應(yīng)的方法寺惫,可用于實(shí)現(xiàn)委托疹吃。
協(xié)議?
協(xié)議是包含了方法和屬性的有名稱列表西雀,采用協(xié)議的方法是在類的@interface聲明中列出的協(xié)議的名稱萨驶,采用協(xié)議后,就要遵守協(xié)議艇肴,實(shí)現(xiàn)協(xié)議下的方法腔呜。@protocol后面是協(xié)議名稱,協(xié)議名稱必須唯一再悼,可以繼承父協(xié)議(與繼承父類相似)核畴,在聲明語(yǔ)句協(xié)議名稱后面的尖括號(hào)內(nèi)可以指定父協(xié)議的名稱。
委托方法冲九?
委托就是某個(gè)對(duì)象指定另一個(gè)對(duì)象處理某些特定任務(wù)的設(shè)計(jì)模式谤草,經(jīng)常與協(xié)議共用。
復(fù)制莺奸?
復(fù)制分為兩類:
- 淺層復(fù)制
不會(huì)復(fù)制所引用的對(duì)象丑孩,新復(fù)制的對(duì)象只會(huì)指向現(xiàn)有的引用對(duì)象,復(fù)制的對(duì)象只會(huì)復(fù)制指向引用對(duì)象的指針灭贷,而不會(huì)復(fù)制引用對(duì)象本身温学。 - 深層復(fù)制
復(fù)制所有的引用對(duì)象。
代碼塊氧腰?
代碼塊對(duì)象是對(duì)C語(yǔ)言中函數(shù)的擴(kuò)展枫浙,除了函數(shù)中的代碼刨肃,還包含變量綁定,代碼塊也稱為閉包箩帚。代碼塊包含兩種類型的綁定:自動(dòng)型與托管型真友,自動(dòng)型使用的是棧中的內(nèi)存,而托管綁定是通過(guò)堆創(chuàng)建的紧帕。代碼塊可以訪問(wèn)與它同時(shí)創(chuàng)建的有效變量盔然。代碼塊借鑒了函數(shù)指針的語(yǔ)法,具有以下特征:
- 返回類型可以手動(dòng)聲明也可以編譯器推導(dǎo)
- 具有指定類型的參數(shù)列表
- 擁有名稱
__block變量是嗜?
本地變量會(huì)被代碼塊作為常量獲取到愈案,如果要修改它們的值必須將它們聲明為可修改的,將變量標(biāo)記為__block,有些變量無(wú)法聲明為__block類型:
- 沒(méi)有長(zhǎng)度可變的數(shù)組
- 沒(méi)有包含可變長(zhǎng)度數(shù)組的結(jié)構(gòu)體
GCD鹅搪?
GCD是一個(gè)系統(tǒng)級(jí)別的技術(shù)站绪,可以在任意級(jí)別的代碼中使用,GCD決定需要多少線程并安排它們運(yùn)行的進(jìn)度丽柿,平衡應(yīng)用程序所有內(nèi)容的加載恢准。
調(diào)度隊(duì)列?
GCD可以使用調(diào)度隊(duì)列同步或異步的執(zhí)行任意代碼甫题,分為三種類型:
連續(xù)隊(duì)列
連續(xù)隊(duì)列會(huì)根據(jù)指派的順序執(zhí)行任務(wù)馁筐,遵循先入先出(FIFO)的原則。并發(fā)隊(duì)列
并發(fā)隊(duì)列能并發(fā)執(zhí)行一個(gè)或多個(gè)任務(wù)坠非,適用于并行運(yùn)行的任務(wù)敏沉,任務(wù)會(huì)根據(jù)指派到隊(duì)列的順序開始執(zhí)行,任務(wù)可以在前一個(gè)任務(wù)結(jié)束前就開始執(zhí)行炎码,遵循先入先出(FIFO)的原則盟迟。主隊(duì)列
它是應(yīng)用程序中有效的主隊(duì)列,執(zhí)行的是應(yīng)用程序的主線程任務(wù)辅肾。使用dispatch_get_main_queue()
可以訪問(wèn)與應(yīng)用程序主線程相關(guān)的連續(xù)隊(duì)列队萤。
隊(duì)列添加任務(wù)?
有兩種方式可以向隊(duì)列中添加任務(wù):
同步
隊(duì)列會(huì)一直等待前面任務(wù)結(jié)束異步
添加任務(wù)后不必等待任務(wù)結(jié)束矫钓,函數(shù)會(huì)立刻返回要尔。推薦使用這種方式,避免阻塞其他代碼的運(yùn)行新娜。
死鎖赵辕?
指的是兩個(gè)或多個(gè)任務(wù)在等待對(duì)方運(yùn)行結(jié)束,想要避免死鎖就絕對(duì)不要給運(yùn)行在同一隊(duì)列中的任務(wù)調(diào)用dispatch_sync
函數(shù)概龄。
UIKit还惠?
iOS應(yīng)用程序使用UIKit框架,它包含了所有的UI組件和構(gòu)成iOS應(yīng)用程序的資源私杜。
屬性列表蚕键?
屬性列表一般簡(jiǎn)寫為plist救欧,用來(lái)放置一些Cocoa能夠處理(主要是存儲(chǔ)到文件和從文件加載)的對(duì)象。
編碼锣光?
Cocoa具備一種將對(duì)象轉(zhuǎn)換成某種格式并保存到磁盤的機(jī)制笆怠。對(duì)象可以將它們的實(shí)例變量和其它數(shù)據(jù)編碼為數(shù)據(jù)塊,然后保存到磁盤中誊爹,這個(gè)過(guò)程稱為編碼也叫做序列化蹬刷。
解碼?
編碼后频丘,數(shù)據(jù)塊以后還可以讀回內(nèi)存中办成,并且還能基于保存的數(shù)據(jù)創(chuàng)建新對(duì)象,這個(gè)過(guò)程叫做解碼也叫反序列化搂漠。
可以采用NSCoding協(xié)議和實(shí)現(xiàn)方法來(lái)編碼和解碼對(duì)象
KVC迂卢?
鍵/值編碼(key-value-coding)是一種間接更改對(duì)象狀態(tài)的方式,也稱為KVC状答。其實(shí)現(xiàn)方法是使用字符串表示要更改的對(duì)象狀態(tài)冷守,鍵/值編碼中的基本調(diào)用時(shí)-valueForKey:
和-setValue: forkey:
。你可以向?qū)ο蟀l(fā)送消息惊科,并傳遞你想要訪問(wèn)的屬性名稱的鍵作為參數(shù)。
-valueForKey:
:的功能非常強(qiáng)大亮钦,會(huì)首先查找以參數(shù)名命名(格式為-key或-isKey)的getter方法馆截,如果沒(méi)有g(shù)etter方法,它會(huì)在對(duì)象內(nèi)尋找名稱格式為_key和key的實(shí)例變量蜂莉。-valueForKey:
在Objective-C運(yùn)行時(shí)中使用元數(shù)據(jù)打開對(duì)象并進(jìn)入其中查找需要的信息蜡娶,通過(guò)KVC,沒(méi)有相關(guān)getter方法也能獲取對(duì)象值映穗,不需要通過(guò)對(duì)象指針來(lái)直接訪問(wèn)實(shí)例變量窖张。鍵路徑不僅能引用對(duì)象值,還可以引用一些運(yùn)算符來(lái)進(jìn)行一些運(yùn)算蚁滋。KVC也可以為對(duì)象進(jìn)行批量處理宿接。
如果使用KVC訪問(wèn)一個(gè)NSArray數(shù)組,它實(shí)際上會(huì)查詢相應(yīng)數(shù)組中的每個(gè)對(duì)象辕录,然后將查詢結(jié)果打包到另一個(gè)數(shù)組中并返回給你睦霎,這種方法也同樣適用于通過(guò)鍵路徑訪問(wèn)的位于對(duì)象中的數(shù)組。
KVC需要解析字符串類計(jì)算需要的答案走诞,速度比較慢副女,此外編譯器無(wú)法對(duì)他進(jìn)行錯(cuò)誤檢查,不能判斷鍵路徑是否正確蚣旱。
null碑幅?
NSNull用于表示不允許空值的集合對(duì)象中的空值戴陡,可以用[NSNull null]
表示nil值。
<null>:是一種[NSNull null]對(duì)象沟涨。
(null):是一個(gè)真正的nil值恤批。
靜態(tài)分析器?
靜態(tài)分析器(static analyzer)拷窜,是一個(gè)不需要運(yùn)行程序就可以從邏輯上檢測(cè)代碼的工具开皿,它可以尋找會(huì)演變成bug的錯(cuò)誤,它不是簡(jiǎn)單的瀏覽源代碼篮昧,而是在應(yīng)用程序的代碼通道中查找邏輯錯(cuò)誤并反饋給你赋荆,可以檢測(cè)的錯(cuò)誤包括:
- 安全問(wèn)題,如內(nèi)存泄漏和緩沖區(qū)溢出懊昨;
- 并發(fā)性問(wèn)題窄潭,如靜態(tài)條件(依賴時(shí)間的兩個(gè)或多個(gè)任務(wù)失效);
- 邏輯問(wèn)題酵颁,包括廢代碼和不好的編碼習(xí)慣嫉你;
有時(shí)會(huì)誤報(bào)錯(cuò)誤,需要消耗時(shí)間來(lái)分析躏惋,拖慢構(gòu)建程序的過(guò)程
Clang?
Clang是一個(gè)加強(qiáng)了C編譯器并在Xcode中為靜態(tài)分析器提供基礎(chǔ)的開源項(xiàng)目幽污。
謂詞?
Cocoa中提供了一個(gè)名為NSPredicate的類簿姨,用于指定過(guò)濾器的條件距误。可以創(chuàng)建NSPredicate對(duì)象扁位,通過(guò)它準(zhǔn)確地描述所需的條件准潭,通過(guò)謂詞篩選每個(gè)對(duì)象,判斷它們是否與條件相匹配域仇。predicate是一個(gè)普通的Objective-C對(duì)象指針刑然,它將指向NSPredicate對(duì)象。
正則表達(dá)式暇务?
它是一種指定字符串匹配邏輯的非常緊湊的方式泼掠,正則表達(dá)式功能非常強(qiáng)大,但是計(jì)算開銷非常大般卑。