編譯鏈接的過程?
你知道哪些編碼方式宵睦?
程序在運(yùn)行時(shí)操作系統(tǒng)除了分配內(nèi)存空間還有什么厢绝?
內(nèi)核態(tài)和用戶態(tài)的區(qū)別芭商?
堆和棧的區(qū)別逾滥,工程項(xiàng)目中的哪些數(shù)據(jù)是儲(chǔ)存在堆哪些在棧中
1它呀、棧(stack):方法調(diào)用涕侈,局部變量等神妹,是連續(xù)的拳昌,高地址往低地址擴(kuò)展趴乡。
2荐吉、堆(heap):通過alloc等分配的對(duì)象焙糟,是離散的,低地址往高地址擴(kuò)展样屠,需要我們手動(dòng)控制穿撮。
3缺脉、未初始化數(shù)據(jù)(bss):未初始化的全局變量等。
4悦穿、已初始化數(shù)據(jù)(data):已初始化的全局變量等攻礼。
5、代碼段(text):程序代碼栗柒。
靜態(tài)方法是否能被重寫礁扮?
OOA、OOD瞬沦、OOP太伊?
OOA(Object Oriented Analysis):面向?qū)ο蠓治?/p>
OOD(Object Oriented Design):面向?qū)ο笤O(shè)計(jì)
OOP(Object Oriented Programming):面向?qū)ο缶幊?/p>
OC中對(duì)象的結(jié)構(gòu)
OC中的內(nèi)省逛钻?
對(duì)象在運(yùn)行時(shí)獲取其類型的能力稱為內(nèi)省僚焦。
OC運(yùn)行時(shí)內(nèi)省的4個(gè)方法:
判斷對(duì)象類型:
? ? ? ? 1、-(BOOL) isKindOfClass: 判斷是否是這個(gè)類或者這個(gè)類的子類的實(shí)例
? ? ? ? 2曙痘、-(BOOL) isMemberOfClass: 判斷是否是這個(gè)類的實(shí)例
判斷對(duì)象/類是否有這個(gè)方法:
? ? ? ? 1芳悲、-(BOOL) respondsToSelector: 判讀實(shí)例是否有這樣方法
? ? ? ? 2、+(BOOL) instancesRespondToSelector: 判斷類是否有這個(gè)方法
id和nill代表什么(nill和NULL的區(qū)別)
1边坤、id 聲明的對(duì)象具有運(yùn)行時(shí)的特性名扛,即可以指向任意類型的Objcetive-C的對(duì)象。
2惩嘉、nil:空指針罢洲,不指向任何位置的指針。
3文黎、NULL:指針存儲(chǔ)的地址是一個(gè)空地址惹苗。
向一個(gè)nill對(duì)象發(fā)送消息會(huì)發(fā)生什么?
首先需要明白2個(gè)問題:
? ??????什么是isa指針耸峭?
? ??????消息傳遞機(jī)制桩蓉?
1、isa指針是用于對(duì)象指向類對(duì)象劳闹,類對(duì)象指向元類對(duì)象的一個(gè)指針院究。而類對(duì)象和元類對(duì)象中又分別存放對(duì)象方法和類方法。 在消息傳遞機(jī)制中本涕,就是通過isa指針來尋找到方法的實(shí)際調(diào)用地址的业汰。
2、objc在向一個(gè)對(duì)象發(fā)送消息時(shí)菩颖,runtime庫(kù)會(huì)根據(jù)對(duì)象的isa指針找到該對(duì)象實(shí)際所屬的類样漆,然后在該類中的方法列表以及其父類方法列表中尋找方法運(yùn)行,然后在發(fā)送消息的時(shí)候晦闰,objc_msgSend方法不會(huì)返回值放祟,所謂的返回內(nèi)容都是具體調(diào)用時(shí)執(zhí)行的鳍怨。 那么,回到本題跪妥,如果向一個(gè)nil對(duì)象發(fā)送消息鞋喇,首先在尋找對(duì)象的isa指針時(shí)就是0地址返回了,所以不會(huì)出現(xiàn)任何錯(cuò)誤眉撵。 ?
多態(tài)
不同對(duì)象以自己的方式響應(yīng)相同的消息的能力叫做多態(tài)侦香。
@property的本質(zhì)是什么?
@property = ivar + getter + setter;
“屬性” (property)有兩大概念:ivar(實(shí)例變量)执桌、getter+setter(存取方法)
“屬性” (property)作為 Objective-C 的一項(xiàng)特性鄙皇,主要的作用就在于封裝對(duì)象中的數(shù)據(jù)。 Objective-C 對(duì)象通常會(huì)把其所需要的數(shù)據(jù)保存為各種實(shí)例變量仰挣。實(shí)例變量一般通過“存取方法”(access method)來訪問伴逸。其中,“獲取方法” (getter)用于讀取變量值膘壶,而“設(shè)置方法” (setter)用于寫入變量值错蝴。
?@property中有哪些屬性關(guān)鍵字?
1.原子性--- atomic颓芭、nonatomic特質(zhì)
2.讀/寫權(quán)限---readwrite(讀寫)顷锰、readonly (只讀)
3.內(nèi)存管理語(yǔ)義---assign、strong亡问、 weak官紫、unsafe_unretained、copy
4.方法名---getter=<name> 州藕、setter=<name>
5.不常用的:nonnull,null_resettable,nullable
解釋屬性修飾關(guān)鍵詞的作用
1束世、 readwrite 是可讀可寫特性。需要生成getter方法和setter方法床玻。
?2)毁涉、readonly 是只讀特性。只會(huì)生成getter方法锈死,不會(huì)生成setter方法贫堰,不希望屬性在類外改變。
?3待牵、assign 是賦值特性其屏。setter方法將傳入?yún)?shù)賦值給實(shí)例變量;僅設(shè)置變量時(shí),assign用于基本數(shù)據(jù)類型。
?4缨该、 retain(MRC)/strong(ARC) 表示持有特性偎行。setter方法將傳入?yún)?shù)先保留,再賦值,傳入?yún)?shù)的retaincount會(huì)+1睦优。?
5、copy 表示拷貝特性壮不。setter方法將傳入對(duì)象復(fù)制一份汗盘,需要完全一份新的變量時(shí)。?
6询一、nonatomic 非原子操作隐孽。決定編譯器生成的setter和getter方法是否是原子操作,atomic表示多線程安全(非絕對(duì))健蕊,一般使用nonatomic菱阵,效率高。
淺拷貝和深拷貝的區(qū)別
淺拷貝:只復(fù)制指向?qū)ο蟮闹羔標豕Γ粡?fù)制引用對(duì)象本身晴及。
深拷貝:復(fù)制引用對(duì)象本身。內(nèi)存中存在了兩份獨(dú)立對(duì)象本身嫡锌,當(dāng)修改A時(shí)虑稼,A_copy不變。
assign势木、weak
1蛛倦、ARC中,有可能出現(xiàn)循環(huán)引用的時(shí)候啦桌,讓一短使用weak溯壶。沒必要強(qiáng)引用的時(shí)候,使用weak甫男,IBOutlet控件屬性且改,當(dāng)然也可以用strong。
2查剖、weak钾虐、assign修飾的屬性指向一個(gè)對(duì)象時(shí),都不會(huì)增加對(duì)象的引用計(jì)數(shù)笋庄。然而在所指的對(duì)象被釋放掉時(shí)效扫,weak屬性值會(huì)被自動(dòng)置為nil,而assign屬性不會(huì)直砂。
3菌仁、assign可以用于非OC對(duì)象及基本類型,weak必須用于OC對(duì)象静暂。
copy和strong的區(qū)別
weak原理
1济丘、weak其實(shí)是系統(tǒng)通過一個(gè)hash表來實(shí)現(xiàn)對(duì)象的弱引用。
2、runtime維護(hù)了一個(gè)weak表摹迷,用于存儲(chǔ)指向某個(gè)對(duì)象的所有weak 指針疟赊。weak表其實(shí)是一個(gè)hash表,Key是所有對(duì)象的地址峡碉,Value是weak指針 的地址(這個(gè)地址的值是所有對(duì)象指針的地址)數(shù)組近哟。
原理:
1、初始化時(shí):runtime會(huì)調(diào)用objc_initWeak函數(shù)鲫寄,初始化一個(gè)新的weak指針指向?qū)ο蟮牡刂?/p>
2吉执、添加引用時(shí):objc_initWeak函數(shù)會(huì)調(diào)用storeWeak(),StoreWeak()的作用是更新指針指向地来,創(chuàng)建對(duì)應(yīng)的弱引用表
3戳玫、釋放時(shí):調(diào)用clearDeallocting()。clearDeallocting()首先根據(jù)對(duì)象地址獲取所有weak指針地址的數(shù)組未斑,然后遍歷這個(gè)數(shù)組把其中的數(shù)據(jù)設(shè)為 nil咕宿,最后把這個(gè)entry從weak表中刪除,最后清理對(duì)象的記錄
為什么不可變對(duì)象要用copy
iOS中的NSCopying協(xié)議蜡秽,copy荠列、mutableCopy的區(qū)別
- (id)copyWithZone:(NSZone *)zone;
copy 返回的是不可變對(duì)象(immutableObject);如果用copy返回值調(diào)用mutable對(duì)象的方法就會(huì)crash载城。
?mutableCopy 返回的是可變對(duì)象(mutableObject)肌似。
1、非集合類對(duì)象
????????對(duì)不可變對(duì)象進(jìn)行copy操作诉瓦,是指針復(fù)制川队,mutableCopy操作是內(nèi)容復(fù)制; 對(duì)可變對(duì)象進(jìn)行copy和mutableCopy都是內(nèi)容復(fù)制睬澡。
2固额、集合類對(duì)象
????????對(duì)不可變對(duì)象進(jìn)行copy操作,是指針復(fù)制煞聪,mutableCopy操作是內(nèi)容復(fù)制斗躏; 對(duì)可變對(duì)象進(jìn)行copy和mutableCopy都是內(nèi)容復(fù)制。但是:集合對(duì)象的內(nèi)容復(fù)制僅限于對(duì)象本身昔脯,對(duì)集合內(nèi)的對(duì)象元素仍然是指針復(fù)制啄糙。(即單層內(nèi)容復(fù)制)
總結(jié):只有對(duì)不可變對(duì)象進(jìn)行copy操作是指針復(fù)制(淺復(fù)制),其它情況都是內(nèi)容復(fù)制(深復(fù)制)云稚。
如果屬性完全不加修飾詞如weak隧饼,atomic,系統(tǒng)會(huì)怎么處理
對(duì)象:@property (atomic, strong, readwrite) xxx
非對(duì)象: @property (atomic, assign, readwrite) xxx
內(nèi)存管理
OC的內(nèi)存管理主要有三種方式ARC(自動(dòng)內(nèi)存計(jì)數(shù))静陈、MRC(手動(dòng)內(nèi)存計(jì)數(shù))燕雁、內(nèi)存池诞丽。
1、自動(dòng)內(nèi)存計(jì)數(shù)ARC:由Xcode自動(dòng)在App編譯階段拐格,在代碼中添加內(nèi)存管理代碼僧免。
2、 手動(dòng)內(nèi)存計(jì)數(shù)MRC:遵循內(nèi)存誰(shuí)申請(qǐng)捏浊、誰(shuí)釋放猬膨;誰(shuí)添加,誰(shuí)釋放的原則呛伴。
3、內(nèi)存釋放池Release Pool:把需要釋放的內(nèi)存統(tǒng)一放在一個(gè)池子中谒所,當(dāng)池子被抽干后(drain)热康,池子中所有的內(nèi)存空間也被自動(dòng)釋放掉。內(nèi)存池的釋放操作分為自動(dòng)和手動(dòng)劣领。自動(dòng)釋放受runloop機(jī)制影響姐军。
簡(jiǎn)述下block的實(shí)現(xiàn)
閉包(block):閉包就是獲取其它函數(shù)局部變量的匿名函數(shù)。
Block的循環(huán)引用尖淘、如何解決奕锌、原理
1、在block內(nèi)部使用外部指針且會(huì)造成循環(huán)引用情況下村生,需要用__week修飾外部指針:
? ??????__weak typeof(self) weakSelf = self;
2惊暴、在block內(nèi)部如果調(diào)用了延時(shí)函數(shù)還使用弱指針會(huì)取不到該指針,因?yàn)橐呀?jīng)被銷毀了趁桃,需要在block內(nèi)部再將弱指針重新強(qiáng)引用一下辽话。
? ??????__strong typeof(self) strongSelf = weakSelf;
3、如果需要在block內(nèi)部改變外部棧區(qū)變量的話卫病,需要在用__block修飾外部變量油啤。
說說你對(duì)內(nèi)存泄漏的看法,追問蟀苛,block為什么容易引起內(nèi)存泄漏益咬?
對(duì)于block理解,MRC和ARC下有什么區(qū)別帜平,使用注意事項(xiàng)
Block和函數(shù)指針的區(qū)別幽告?
[object copy]是淺拷貝還是深拷貝?為什么是淺拷貝裆甩?copy是實(shí)現(xiàn)了哪個(gè)協(xié)議评腺?
對(duì)MRC和ARC的理解
談對(duì)引用計(jì)數(shù)的理解
談?wù)剬?duì)自動(dòng)釋放池的理解
自動(dòng)釋放池:以棧的形式實(shí)現(xiàn),當(dāng)你創(chuàng)建一個(gè)新的自動(dòng)釋放池時(shí)淑掌,它將被添加到棧頂蒿讥。當(dāng)一個(gè)對(duì)象收到發(fā)送 autorelease 消息時(shí),它被添加到當(dāng)前線程的處于棧頂?shù)淖詣?dòng)釋放池中,當(dāng)自動(dòng)釋放池被回收時(shí)芋绸,它們從棧中被刪除媒殉, 且會(huì)給池子里面所有的對(duì)象都會(huì)做一次 release 操作。
主要通過下列三個(gè)函數(shù)完成:
????????objc_autoreleasepoolPush
????????objc_autoreleasepoolPop
????????objc_autorelease
自動(dòng)釋放池在MRC和ARC區(qū)別
多層自動(dòng)釋放池嵌套的對(duì)象在哪一層釋放
1廷蓉、手動(dòng)添加的是大括號(hào)結(jié)束的時(shí)候釋放
2、系統(tǒng)自動(dòng)釋放是在當(dāng)前runloop循環(huán)結(jié)束的時(shí)候
那子線程中的autorelease變量什么時(shí)候釋放马昙?
子線程里面桃犬,需要加autoreleasepool嗎
category和extension區(qū)別,系統(tǒng)如何底層實(shí)現(xiàn)category
單例和全局變量的區(qū)別行楞。
iOS 為什么沒有類似于 Java 和 C 之類的 “Builder” 的構(gòu)造模式
Block和Protocol的區(qū)別攒暇,Block是為了解決什么問題而使用的
OC的反射機(jī)制
1、Class的反射
? ??????FOUNDATION_EXPORT NSString *NSStringFromClass(Class aClass);
????????FOUNDATION_EXPORT Class __nullable NSClassFromString(NSString *aClassName);
2子房、SEL的反射
????????FOUNDATION_EXPORT NSString *NSStringFromSelector(SEL aSelector);
? ??????FOUNDATION_EXPORT SEL NSSelectorFromString(NSString *aSelectorName);
3形用、Protocol
? ??????FOUNDATION_EXPORT NSString *NSStringFromProtocol(Protocol *proto) NS_AVAILABLE(10_5, 2_0);
? ??????FOUNDATION_EXPORT Protocol * __nullable NSProtocolFromString(NSString *namestr) NS_AVAILABLE(10_5, 2_0);
實(shí)例:
根據(jù)后臺(tái)推送過來的數(shù)據(jù),進(jìn)行動(dòng)態(tài)頁(yè)面跳轉(zhuǎn)证杭,跳轉(zhuǎn)到頁(yè)面后根據(jù)返回到數(shù)據(jù)執(zhí)行對(duì)應(yīng)的操作田度。
iOS是如何進(jìn)行資源管理的
一張圖片的內(nèi)存占用大小是由什么決定的
索引有什么用?
創(chuàng)建索引可以大大提高系統(tǒng)的性能解愤。
1镇饺、通過創(chuàng)建唯一性索引,可以保證數(shù)據(jù)庫(kù)表中每一行數(shù)據(jù)的唯一性送讲。
2兰怠、可以大大加快數(shù)據(jù)的檢索速度,這也是創(chuàng)建索引的最主要的原因李茫。
3揭保、可以加速表和表之間的連接,特別是在實(shí)現(xiàn)數(shù)據(jù)的參考完整性方面特別有意義魄宏。
4秸侣、在使用分組和排序子句進(jìn)行數(shù)據(jù)檢索時(shí),同樣可以顯著減少查詢中分組和排序的時(shí)間宠互。
5味榛、通過使用索引,可以在查詢的過程中予跌,使用優(yōu)化隱藏器搏色,提高系統(tǒng)的性能。
存一個(gè)通訊錄券册,包括增刪改查频轿,用什么數(shù)據(jù)結(jié)構(gòu)
isEquel和hash的關(guān)系
bitmap的結(jié)構(gòu)
數(shù)組的淺拷貝與深拷貝
字典的工作原理 垂涯?怎100w個(gè)中是怎么快速去取value?
數(shù)據(jù)庫(kù)
JSON航邢、XML
1耕赘、JSON與XML的區(qū)別:
(1)可讀性方面:基本相同,XML的可讀性比較好膳殷;
(2)可擴(kuò)展性方面:都具有良好的擴(kuò)展性操骡;
(3)編碼難度方面:相對(duì)而言,JSON的編碼比較容易赚窃;
(4)解碼難度:JSON的解碼難度基本為零册招,XML需要考慮子節(jié)點(diǎn)和父節(jié)點(diǎn);
(5)數(shù)據(jù)體積方面:JSON相對(duì)于XML來講勒极,數(shù)據(jù)體積小是掰,傳遞的速度比較快;
(6)數(shù)據(jù)交互方面:JSON與javascript的交互更加方便河质,更容易解析處理,更好的數(shù)據(jù)交互震叙;
(7)數(shù)據(jù)描述方面:XML對(duì)數(shù)據(jù)描述性比較好
(8)傳輸速度方面:JSON的速度遠(yuǎn)遠(yuǎn)快于XML掀鹅。
2、JSON與XML底層實(shí)現(xiàn)原理:
(1)JSON底層原理:遍歷字符串中的字符媒楼,最終根據(jù)格式規(guī)定的特殊字符乐尊,比如{}、[]划址、:等進(jìn)行區(qū)分扔嵌,{}號(hào)表示字典,[]號(hào)表示數(shù)組夺颤,:號(hào)是字典的鍵和值的分水嶺痢缎,最終仍是將JSON轉(zhuǎn)化為字典,只不過字典中的值可能是“字典世澜、數(shù)組或者字符串而已”独旷。
(2)XML底層原理:XML解析常用的解析方法有兩種:DOM解析和SAX解析;DOM采用的是樹形結(jié)構(gòu)的方式訪問XML文檔寥裂,而SAX采用的是事件模型嵌洼;DOM解析把XML文檔轉(zhuǎn)化為一個(gè)包含其內(nèi)容的樹,并可以對(duì)樹進(jìn)行遍歷封恰,使用DOM解析器的時(shí)候需要處理整個(gè)XML文檔麻养,所以對(duì)內(nèi)存和性能的要求比較高;SAX在解析XML文檔的時(shí)候可以觸發(fā)一系列的事件诺舔,當(dāng)發(fā)現(xiàn)給定的tag的時(shí)候鳖昌,他可以激活一個(gè)回調(diào)方法备畦,告訴該方法指定的標(biāo)簽已經(jīng)找到,SAX對(duì)內(nèi)存的要求通常會(huì)比較低遗遵,因?yàn)樗岄_發(fā)人員自己來決定所要處理的tag萍恕,特別是當(dāng)開發(fā)人員只需要處理文檔中所包含部分?jǐn)?shù)據(jù)時(shí),SAX這種擴(kuò)展能力得到了更好的體現(xiàn)车要。