iOS面試題總結(jié)
1.說(shuō)下線程和進(jìn)程的區(qū)別
答:(1)一個(gè)線程只能屬于一個(gè)進(jìn)程泳叠,而一個(gè)進(jìn)程可以有多個(gè)線程决记,但至少有一個(gè)線程美莫。線程是操作系統(tǒng)可識(shí)別的最小執(zhí)行和調(diào)度單位爪瓜。 (2)資源分配給進(jìn)程屎蜓,同一進(jìn)程的所有線程共享該進(jìn)程的所有資源。 同一進(jìn)程中的多個(gè)線程共享代碼段(代碼和常量)钥勋,數(shù)據(jù)段(全局變量和靜態(tài)變量)炬转,擴(kuò)展段(堆存儲(chǔ))。但是每個(gè)線程擁有自己的棧段算灸,棧段又叫運(yùn)行時(shí)段扼劈,用來(lái)存放所有局部變量和臨時(shí)變量。 (3)處理機(jī)分給線程菲驴,即真正在處理機(jī)上運(yùn)行的是線程荐吵。 (4)線程在執(zhí)行過(guò)程中,需要協(xié)作同步赊瞬。不同進(jìn)程的線程間要利用消息通信的辦法實(shí)現(xiàn)同步先煎。?
2.如何保證線程安全
一塊資源可能會(huì)被多個(gè)線程共享,也就是多個(gè)線程可能會(huì)訪問(wèn)同一塊資源巧涧,比如多個(gè)線程訪問(wèn)同一個(gè)對(duì)象薯蝎、同一個(gè)變量、同一個(gè)文件谤绳。當(dāng)多個(gè)線程訪問(wèn)同一塊資源時(shí)占锯,很容易引發(fā)數(shù)據(jù)錯(cuò)亂和數(shù)據(jù)安全問(wèn)題。此時(shí)缩筛,我們需要用線程鎖來(lái)解決
(1)nonatomic atomic:使用atomic多線程原子性控制消略,atomic的原理給setter加上鎖,getter不會(huì)加鎖瞎抛。OC在定義屬性時(shí)有nonatomic和atomic兩種選擇atomic:原子屬性艺演,為setter方法加鎖(默認(rèn)就是atomic)nonatomic:非原子屬性,不會(huì)為setter方法加鎖
3、使用NSLock
-(void)threadRunLock { _lock =[[NSLock alloc]init];while(true){[_lock lock];if(self.number > 0){[NSThread sleepForTimeInterval:0.5];self.number --;NSLog(@"thread:%@ ---> %ld",[[NSThread currentThread]name],self.number);}[_lock unlock];} }相當(dāng)于給代碼片段加上lock了胎撤,所以依次輸出9-0
4晓殊、使用互斥鎖
@synchronized(鎖對(duì)象){ //需要鎖定的代碼}注意:鎖定1份代碼只用1把鎖,用多把鎖是無(wú)效的-(void)sellTickets { while(true){ @synchronized(self){ //只能加一把鎖//1.先檢查票數(shù)int count=self.leftTicketsCount;if(count>0){ //暫停一段時(shí)間[NSThread sleepForTimeInterval:0.002];//2.票數(shù)-1 self.leftTicketsCount= count-1;//獲取當(dāng)前線程N(yùn)SThread *current=[NSThread currentThread];NSLog(@"%@--賣(mài)了一張票哩照,還剩余%d張票",current,self.leftTicketsCount);} else { //退出線程[NSThread exit];} } } }
互斥鎖的優(yōu)缺點(diǎn):
優(yōu)點(diǎn):能有效防止因多線程搶奪資源造成的數(shù)據(jù)安全問(wèn)題
缺點(diǎn):需要消耗大量的CPU資源
3、了解哪些設(shè)計(jì)模式
?(1)代理模式
? (2)觀察者模式
? (3)MVC模式
? (4)單例模式
4懒浮、堆和棧的區(qū)別飘弧,工程項(xiàng)目中的哪些數(shù)據(jù)是儲(chǔ)存在堆哪些在棧中
在引入堆和棧之前,先要知道砚著,iOS中的內(nèi)存管理范圍:
? ? oc對(duì)象需要進(jìn)行內(nèi)存管理次伶,非oc對(duì)象不需要進(jìn)行內(nèi)存管理,比如基本數(shù)據(jù)類(lèi)型
OC對(duì)象存放于堆里面(堆內(nèi)存要程序員手動(dòng)回收)
非OC對(duì)象一般放在棧里面(棧內(nèi)存會(huì)被系統(tǒng)自動(dòng)回收)
堆里面的內(nèi)存是動(dòng)態(tài)分配的稽穆,所以也就需要程序員手動(dòng)的去添加內(nèi)存冠王、回收內(nèi)存
堆和棧的區(qū)別:
‘棧是吃了吐 LIFO(先進(jìn)后出)
堆是吃了拉 FIFO(先進(jìn)先出)
5、iOS中的NSCopying協(xié)議舌镶,copy,MutableCopy的區(qū)別
首先我們先說(shuō)兩個(gè)兩個(gè)概念:
淺復(fù)制:不拷貝對(duì)象本身柱彻,僅僅是拷貝指向?qū)ο蟮闹羔?/p>
深復(fù)制:是直接拷貝整個(gè)對(duì)象內(nèi)存到另一塊內(nèi)存中
然后我們?cè)賮?lái)看copy關(guān)鍵字的特點(diǎn):
修改源對(duì)象的屬性和行為,不會(huì)影響副本對(duì)象修改副本對(duì)象的屬性和行為餐胀,不會(huì)影響源對(duì)象一個(gè)對(duì)象可以通過(guò)copy和mutableCopy方法來(lái)創(chuàng)建一個(gè)副本對(duì)象copy:創(chuàng)建的是不可變副本(NSString哟楷,NSArray,NSDictionary)mutableCopy:創(chuàng)建的是可變副本(NSMutableString否灾,NSMutableArray卖擅,NSMutableDictionary)
6、解釋屬性修飾關(guān)鍵詞的作用(weak,strong,copy,readOnly,assgin,nonatomic等)
1.assgin 此標(biāo)記說(shuō)明設(shè)置器直接進(jìn)行賦值墨技,這也是默認(rèn)值且setter方法直接將傳入?yún)?shù)賦值給實(shí)例變量惩阶,不涉及引用計(jì)數(shù)的變化,也沒(méi)有引用技術(shù)可以供管理扣汪; 主要用于非指針變量(也可以修飾指針變量断楷,但是平時(shí)都不這么用),即用于基礎(chǔ)數(shù)據(jù)類(lèi)型(例如NSInteger)和C的數(shù)據(jù)類(lèi)型(int, float, double, char)另外還有id類(lèi)型的屬性崭别,總而言之脐嫂,前面不需要加"*"的就可以用assign修飾;
2.retian : 表示持有特性紊遵,一般用于指針對(duì)象账千,例如數(shù)組(NSMutableArray,NSArray)暗膜,字典對(duì)象匀奏,視圖對(duì)象(UIView ),控制器對(duì)象(UIViewController)等学搜,這些屬性需要保存引用計(jì)數(shù)娃善; 就是說(shuō)你定義了一個(gè)變量论衍,然后這個(gè)變量在程序的運(yùn)行過(guò)程中會(huì)被更改,并且影響到其他方法聚磺,當(dāng)用retain時(shí)坯台,會(huì)釋放舊的對(duì)象,將輸入對(duì)象的索引計(jì)數(shù)+1瘫寝,然后將輸入對(duì)象的值賦予新對(duì)象蜒蕾。
3.copy : 其setter方法是進(jìn)行Copy操作,與retain處理流程基本一樣焕阿,先舊對(duì)象release咪啡,再Copy出新的對(duì)象,retainCount為1暮屡,這是為了減少對(duì)上下文的依賴(lài)而引入的機(jī)制撤摸,區(qū)別在于copy主要用于NSString;retain是指針拷貝褒纲,copy是內(nèi)容拷貝然后新的對(duì)象開(kāi)辟新內(nèi)存准夷,引用計(jì)數(shù)為1,原來(lái)對(duì)象計(jì)數(shù)不變
4.weak: weak是弱引用莺掠,是由ARC引入的對(duì)象變量的屬性冕象,相當(dāng)于assign,只有在你打開(kāi)ARC時(shí)才會(huì)被要求使用(但是weak只能修飾對(duì)象即指針類(lèi)型的屬性和id類(lèi)型的屬性汁蝶,所以在ARC中修飾基本數(shù)據(jù)類(lèi)型的屬性還是要用assign)渐扮; weak比assign多了一個(gè)功能,就是對(duì)象消失后把指針置為nil掖棉,避免了野指針墓律,不是null指針,是指向“垃圾”內(nèi)存(不可用的內(nèi)存)的指針幔亥;
5.strong:
strong是強(qiáng)引用耻讽,是ARC新引入的對(duì)象變量屬性稻爬,簡(jiǎn)單講strong等同retain宁炫,只有在你打開(kāi)ARC時(shí)才會(huì)被要求使用奕坟;
但是對(duì)于strong來(lái)說(shuō)颜价,它會(huì)自己判斷是選擇retain還是copy,比較方便瀑粥。
6.readonly: 此標(biāo)記說(shuō)明屬性是只讀的台汇,默認(rèn)的標(biāo)記是讀寫(xiě)砾淌,如果你指定了只讀即纲,在@implementation中只需要一個(gè)讀取器具帮,如果你使用@synthesize關(guān)鍵字,也只有讀取器方法被解析,即只會(huì)生成getter方法蜂厅,不會(huì)生成setter方法匪凡; 不希望屬性在類(lèi)外改變時(shí)候使用。
7.readwrite:
此標(biāo)記說(shuō)明屬性會(huì)被當(dāng)成讀寫(xiě)的掘猿,這也是默認(rèn)屬性病游。設(shè)置器和讀取器都需要在@implementation中實(shí)現(xiàn)。如果使用@synthesize關(guān)鍵字稠通,讀取器和設(shè)置器都會(huì)被解析衬衬,即會(huì)同時(shí)生成getter和setter方法;
8.nonatomic:
非原子性訪問(wèn)采记,對(duì)屬性賦值的時(shí)候不加鎖佣耐,不加同步政勃,多線程并發(fā)訪問(wèn)會(huì)提高性能唧龄。如果不加此屬性,則默認(rèn)是兩個(gè)訪問(wèn)方法都為原子型事務(wù)訪問(wèn)奸远;
非原子操作既棺,會(huì)簡(jiǎn)單的操作屬性的值,這會(huì)加快屬性存取的速度懒叛,但沒(méi)辦法保證在多線程環(huán)境下不出錯(cuò)丸冕。
9.atomc:
原子操作,這是默認(rèn)的薛窥,在多線程環(huán)境下胖烛,本方法設(shè)定為原子操作提供了可靠的屬性存取方法,而不用擔(dān)心并發(fā)時(shí)會(huì)產(chǎn)生問(wèn)題诅迷;
這也就是說(shuō)佩番,在多線程環(huán)境下,解析的訪問(wèn)器提供一個(gè)對(duì)屬性的安全訪問(wèn)罢杉,從獲取器得到的返回值或者通過(guò)設(shè)置器設(shè)置的值可以一次完成趟畏,即便是別的線程也正在對(duì)其進(jìn)行訪問(wèn)。