1、簡(jiǎn)述UIViewController的生命周期(注意:didReceiveMemoryWarning只有內(nèi)存警告才會(huì)走)
alloc -> init -> loadView->viewDidLoad->viewWillApper->viewDidApper->viewWillDisApper-didReceiveMemoryWarning->dealloc

2、?import跟 include又什么區(qū)別,@class呢,#import<>跟# Import""又什么區(qū)別?
?#import是 Objective-C導(dǎo)入頭文件的關(guān)鍵字,?
include是C/C++導(dǎo)入頭文件的關(guān)鍵字。
使用# import頭文件會(huì)自動(dòng)只導(dǎo)入一次,不會(huì)重復(fù)導(dǎo)入,相當(dāng)于 #include和 #pragma once;
@class則告訴編譯器某個(gè)類的聲明,當(dāng)執(zhí)行時(shí),才去查看類的實(shí)現(xiàn)文件,可以解決頭文件的相互包含;
# import<>用來包含系統(tǒng)的頭文件,# import""用來包含用戶頭文件。
3、鎖

4、KVC

5、KVO

6、HASH的特點(diǎn):
? ? ? ? ? ? ? ? @1、算法是公開的,@2、對(duì)相同數(shù)據(jù)的運(yùn)算,得到的結(jié)果是一樣的,@3、對(duì)不同數(shù)據(jù)運(yùn)算,如MD5得到的結(jié)果默認(rèn)是128位,32個(gè)字符(16進(jìn)制標(biāo)識(shí))@ 4、算法不能逆運(yùn)算,@5、信息摘要,信息“指紋”,是用來做數(shù)據(jù)識(shí)別的。
用途:用戶密碼的加密、搜索引擎、版權(quán)、數(shù)字簽名
密碼加密方式:直接使用MD5、MD5加鹽、HMAC加密方案、添加一點(diǎn)東西
對(duì)稱加密:明文通過秘鑰加密得到密文。密文通過秘鑰解密得到明文。
非對(duì)稱加密(RSA):分公鑰和私鑰,一般公鑰只能用來加密,私鑰只能用來解密和生成公鑰。加密速度比較低,私鑰由自己生成,再由私鑰生成公鑰,將公鑰分發(fā)出去
用戶注冊(cè)的時(shí)候:需要把用戶的密碼進(jìn)行hash過后傳到后臺(tái)進(jìn)行保存
用戶登錄密碼加密:1、服務(wù)器獲取key和密碼進(jìn)行HMAC加密 +獲取當(dāng)前的時(shí)間戳,然后進(jìn)行hash,發(fā)給服務(wù)器
服務(wù)器:1、服務(wù)器獲取key和密碼進(jìn)行HMAC加密 +獲取當(dāng)前的時(shí)間戳(時(shí)間戳可能會(huì)有延遲,可以往后一分鐘進(jìn)行拼接),然后進(jìn)行hash,然后把客戶端傳過來的字符串是否相同,相同就登錄成功,
7、Socket


8、weak與assign:weak一般在delegate中使用,解決循環(huán)引用問題,防止內(nèi)存泄露,因?yàn)樾揎椀膶?duì)象釋放后,引用計(jì)數(shù)為0,指針自動(dòng)被置為nil,assign可修飾對(duì)象,和基本數(shù)據(jù)類型,修飾對(duì)象,會(huì)產(chǎn)生野指針問題;如果修飾基本數(shù)據(jù)類型則是安全的。修飾的對(duì)象釋放后,指針不會(huì)自動(dòng)被置空,此時(shí)向?qū)ο蟀l(fā)消息會(huì)崩潰。
copy與strong的區(qū)別?:在不可變的數(shù)據(jù)類型中都是淺拷貝,而在可變的數(shù)據(jù)類型中strong是淺拷貝,而copy是深拷貝
深拷貝和淺拷貝的區(qū)別
?? ? 深拷貝:內(nèi)容拷貝,拷貝數(shù)據(jù)到一個(gè)新的內(nèi)存區(qū)域,兩個(gè)對(duì)象的值雖然相同,但是內(nèi)存地址不一樣,兩個(gè)對(duì)象都不相關(guān)了
?? ? 淺拷貝:是拷貝原來對(duì)象的指針,而內(nèi)存地址不變,當(dāng)原來的指針對(duì)象值改變的時(shí)候,拷貝的指針對(duì)象的值也會(huì)變
?@property 這個(gè)關(guān)鍵詞的唯一作用就是聲明getter、setter方法接口
?@synthesize 實(shí)現(xiàn)setter、getter方法,找不到實(shí)例變量則主動(dòng)創(chuàng)建一個(gè):
? ? ? ? ? ? 例如:@synthesize proName =_proName
??@dynamic 語(yǔ)義是用戶要求自動(dòng)生成setter getter方法,系統(tǒng)不會(huì)自動(dòng)生成,;
?? ? atomic 默認(rèn)屬性。當(dāng)前進(jìn)程進(jìn)行到一半,其他線程來訪問當(dāng)前線程,可以保證先執(zhí)行完畢當(dāng)前線程。只是保證setter/getter完整,不是線程安全。
?? ? nonatomic 非默認(rèn)屬性。兩個(gè)線程同時(shí)訪問同一個(gè)屬性將會(huì)導(dǎo)致無法預(yù)計(jì)的結(jié)果。優(yōu)點(diǎn)是程序運(yùn)行速度快。
?? ? retain 強(qiáng)應(yīng)用類型,在ARC自動(dòng)內(nèi)存管理時(shí),相當(dāng)于strong;
?autorelease:本質(zhì)就是延遲調(diào)用release方法 。底層主要數(shù)據(jù)結(jié)構(gòu)是__AtAutoreleasePool,AutoreleasePoolPage
?? ? 最終都是通過AutoreleasePoolPage對(duì)象來管理的。
?? ? AutoreleasePool(自動(dòng)釋放池)是 OC 中的一種內(nèi)存管理機(jī)制,它持有釋放池里的對(duì)象的所有權(quán),在自動(dòng)釋放池銷毀時(shí),統(tǒng)一給所有對(duì)象發(fā)送一次 release 消息。通過這個(gè)機(jī)制,可以延遲對(duì)象的釋放。
?? ? autoreleasepool在何時(shí)被釋放?
?? ? Runloop創(chuàng)建的AutoreleasePool,只會(huì)在Runloop即將休眠或退出的時(shí)候銷毀,這時(shí)候池中的對(duì)象才會(huì)被釋放
?? ? 說一下iOS內(nèi)存分區(qū)情況?
?? ? 內(nèi)存其實(shí)分為五大分區(qū),棧區(qū)(系統(tǒng)管理的地方)、堆區(qū)(程序員控制的地方)、常量區(qū)(全局區(qū))、靜態(tài)區(qū)和代碼區(qū),
?? ? 棧區(qū):棧是編譯器自動(dòng)分配釋放來管理內(nèi)存,用戶存放程序臨時(shí)創(chuàng)建的變量、函數(shù)值等,由于棧的先進(jìn)后出的特點(diǎn),特別適合保存恢復(fù)當(dāng)前的代碼塊區(qū)域操作
?? ? 堆區(qū):是由程序員分配和釋放,(程序不釋放,可能會(huì)導(dǎo)致內(nèi)存泄露),是動(dòng)態(tài)分配內(nèi)存段,大小不固定,可動(dòng)態(tài)擴(kuò)張和縮放
? ? ? ? ? ? ? ? 堆區(qū)的內(nèi)存分配使用的是alloc,ARC的內(nèi)存管理,是編譯器在編譯的時(shí)候自動(dòng)添加retain,release,autorelease,堆區(qū)的地址是從低到高
?? ? 常量區(qū):常量存儲(chǔ)區(qū)是一塊比較特殊的存儲(chǔ)區(qū),存放的都是常量
?? ? 全局靜態(tài)區(qū):分為數(shù)據(jù)區(qū)和bss區(qū),數(shù)據(jù)區(qū)存放可執(zhí)行文件中已經(jīng)初始化的全局變量,bss區(qū)存放的是未初始化的全局變量和未初始化的靜態(tài)變量
?? ? 代碼區(qū):就是存放APP代碼,防止運(yùn)行時(shí)被修改,所以只能讀取,不能寫入
?iOS 如何解決循環(huán)引用?
? ? ? ? 1.在delegate中用weak弱引用
? ? ? ? 2、block:使用__weak typeof(self) weakSelf = self;打斷循環(huán)引用,如果擔(dān)心對(duì)象在block中提前釋放:用 __strong typeof (self) strongSelf = weakSelf;
? ? ? ? 3、定時(shí)器(NSTimer),在何時(shí)的地方將其invalidate并置為nil即可
runloop和線程的關(guān)系?
? ? ? ? runloop和線程是一一對(duì)應(yīng)的關(guān)系,主線程的runloop是自動(dòng)開啟的,子線程需要手動(dòng)開啟([[NSRunLoop currentRunLoop]run])
? ? ? ? isa指針的理解,對(duì)象isa指針指向哪里?
? ? ? ? isa指針指向等價(jià)于 is kind of
? ? ? ? 實(shí)例對(duì)象isa指向類對(duì)象、類對(duì)象的isa指向元類對(duì)象、元類對(duì)象的isa指向元類的基類
? ? ? ? 兩種類型:isa指針,superclass指針
Runtime是怎么實(shí)現(xiàn)weak?
?? ? Runtime對(duì)注冊(cè)的類會(huì)進(jìn)行布局,對(duì)于weak對(duì)象會(huì)放入一個(gè)hash表中,用weak指向的“對(duì)象的內(nèi)存地址”作為key,當(dāng)對(duì)象的引用計(jì)數(shù)為0的時(shí)調(diào)用dealloc方法,此時(shí)會(huì)在weak表中搜索,將所有weak對(duì)象置為nil;
? ? ? ? Runtime是一套C語(yǔ)言的API,,編寫的OC代碼都是轉(zhuǎn)換成Runtime_API進(jìn)行調(diào)用
?? ? OC是動(dòng)態(tài)時(shí)語(yǔ)言:在運(yùn)行時(shí)確定一個(gè)對(duì)象的類型,調(diào)用那個(gè)對(duì)象的方法,都需要Runtime來做類和對(duì)象的動(dòng)態(tài)創(chuàng)建,消息傳遞和消息轉(zhuǎn)發(fā)
?? ? load 和 initialize的區(qū)別?
?? ? initalize該類只調(diào)用一次,load是每次進(jìn)入該類都會(huì)調(diào)用
?iOS 中造成tableView卡頓的原因都有哪些呢?
?? ? 1、沒有使用cell的重用標(biāo)識(shí)符,導(dǎo)致一直創(chuàng)建新的cell
?? ? 2、每次cell的重新布局
?? ? 3、沒有提前計(jì)算并緩存cell的屬性及內(nèi)容
?? ? 4、加載網(wǎng)絡(luò)數(shù)據(jù),下載圖片,沒有使用異步加載和緩存圖片
?? ? 5、沒有做緩存行高,每次都需要計(jì)算行高
? ? ? ? 如何降低APP包的大小?
? ? ? ? 刪除不必要的圖片,刪除不需要的類文件,刪除項(xiàng)目中沒有用到的庫(kù)文件,刪除不需要的資源文件
?? ? iOS內(nèi)存泄露排查方法?
? ? ? ? 內(nèi)存泄露是指申請(qǐng)的內(nèi)存空間使用完成之后沒有及時(shí)回收,導(dǎo)致頁(yè)面不釋放,從而加劇內(nèi)存暴增
? ? ? ? ? ? 靜態(tài)內(nèi)存泄露分析方法:通過xcode打開項(xiàng)目,點(diǎn)擊Product,在下拉菜單中點(diǎn)擊Analyze就可以進(jìn)行靜態(tài)內(nèi)存泄漏分析
? ? ? ? ? ? 動(dòng)態(tài)分析:Instrument中的Leaks來分析
?? ? iOS常見的項(xiàng)目設(shè)計(jì)模式:MVC,MVVM
? ? iOS 結(jié)構(gòu)設(shè)計(jì)模式:KVO、KVC、橋接模式、單利模式、代理模式
?什么是多線程?
?? ? 即1個(gè)進(jìn)程中可以開啟多條線程,每條線程可以同時(shí)執(zhí)行不同的任務(wù)。
?? ? 一、多線程的優(yōu)缺點(diǎn):
?? ? 優(yōu)點(diǎn): 1.能適當(dāng)提高程序的執(zhí)行效率? 2.能適當(dāng)提高資源的利用率(cpu,內(nèi)存); 3.線程上的任務(wù)執(zhí)行完成之后,線程會(huì)自動(dòng)銷毀;
?? ? 缺點(diǎn): 1.開啟線程需要占用一定的內(nèi)存空間(默認(rèn)占用512KB); 2.開啟大量的線程,會(huì)占用大量的內(nèi)存空間,降低程序的性能;
?? ? ? ? ? 3.線程越多,cpu在調(diào)用線程上的開銷就越大;4.程序設(shè)計(jì)更加復(fù)雜,比如線程間的通信,多線程的數(shù)據(jù)共享
? ? ? ? 如何保證線程的安全?:線程加鎖
?? ? 線程中的死鎖?
?? ? 死鎖形成的原因:
?? ? 系統(tǒng)資源不足
?? ? 進(jìn)程(線程)推進(jìn)的順序不恰當(dāng);
?? ? 資源分配不當(dāng)
?? ? 死鎖形成的條件:
?? ? 互斥條件:一個(gè)資源每次只能被一個(gè)進(jìn)程使用
?? ? 占有且等待:一個(gè)進(jìn)程因請(qǐng)求資源而阻塞時(shí),對(duì)已獲得的資源保持不放。
?? ? 不剝奪條件:進(jìn)程已獲得資源,在末使用完之前,不能強(qiáng)行剝奪。
?? ? 循環(huán)等待條件:若干進(jìn)程之間形成一種頭尾相接的循環(huán)等待資源關(guān)系。
1. 為什么說Objective-C是一門動(dòng)態(tài)的語(yǔ)言?4.如何令自己所寫的對(duì)象具有拷貝功能?
? ? ? ? 因?yàn)镺bjective—C可以通過Runtime這個(gè)運(yùn)行機(jī)制,在運(yùn)行時(shí)動(dòng)態(tài)的添加變量、方法、類等
? ? 2、為什么代理要用weak?代理的delegate和dataSource有什么區(qū)別?block和代理的區(qū)別?
?? ? ? 防止循環(huán)引用 ,delegate偏重于與用戶交互的回調(diào),datasource偏重于數(shù)據(jù)的返回
? ? ? ? 區(qū)別在于:代理傾向于過程,block傾向于結(jié)果。.代理書寫起來繁瑣一些,block很便捷。代理運(yùn)行成本低,block運(yùn)行成本高。優(yōu)先使用block(單次,或回調(diào)很少,不頻繁),如果需要頻繁的回調(diào),數(shù)量比較多的回調(diào),例如tableView的代理方法,界面滾動(dòng)的時(shí)候會(huì)反復(fù)調(diào)用,就適合用代理。單次,或者比較少的回調(diào)適合用block。有利于優(yōu)化性能。
?? ? A:屬性的本質(zhì)是@property = ivar+getter+setter,也就是說@property系統(tǒng)會(huì)自動(dòng)生成getter和setter方法。屬性默認(rèn)的關(guān)鍵字包括atomic,nonatomic,@synthesize,@dynamic,getter=getterName,setter=setterName,readwrite,readonly,assign,retain,copy。
?? ? @dynamic:表示變量對(duì)應(yīng)的屬性訪問器方法,是動(dòng)態(tài)實(shí)現(xiàn)的,你需要在 NSObject 中繼承而來的 +(BOOL) resolveInstanceMethod:(SEL) sel 方法中指定 動(dòng)態(tài)實(shí)現(xiàn)的方法或者函數(shù)。
?? ? @synthesize:如果沒有實(shí)現(xiàn)setter和getter,編譯器能夠自動(dòng)實(shí)現(xiàn)getter和setter方法。
?? ? A:若想讓自己寫的對(duì)象具有拷貝功能,則需要實(shí)現(xiàn)NSCopying協(xié)議。如果自定義的對(duì)象分為可變版本和非可變版本,那么就要同時(shí)實(shí)現(xiàn)NSCopying和NSMutableCopying協(xié)議,不過一般沒什么必要,實(shí)現(xiàn)NSCopying協(xié)議就夠了。
?? ? 5.可變集合類 和 不可變集合類的 copy 和 mutablecopy有什么區(qū)別?如果是集合是內(nèi)容復(fù)制的話,集合里面的元素也是內(nèi)容復(fù)制么?
?? ? A:對(duì)于不可變對(duì)象,copy操作是淺復(fù)制,mutableCopy是深復(fù)制。對(duì)于不可變對(duì)象,mutableCopy不僅僅是深復(fù)制,返回的對(duì)象類型還是不可變對(duì)象類型相應(yīng)的可變對(duì)象的類型。內(nèi)容復(fù)制也就是深拷貝,集合的深復(fù)制有兩個(gè)方法,可以用initWithArray:copyItems:將第二個(gè)參數(shù)設(shè)置為YES即可進(jìn)行深復(fù)制,如:NSDictionary shallowCopyDict =[NSDictionary alloc]initWithDictionary:someDictionary copyItems:YES];如果用這個(gè)方法深復(fù)制,集合里的每個(gè)元素都會(huì)收到copyWithZone:消息。如果集合里的對(duì)象遵循NSCopying協(xié)議,那么對(duì)象就會(huì)深復(fù)制到新的集合。如果對(duì)象沒有遵循NSCopying協(xié)議,而嘗試用這種方法進(jìn)行深復(fù)制則會(huì)出錯(cuò)。copyWithZone:這種拷貝方式只能提供一層內(nèi)存拷貝,而非真正的深拷貝。第二種方法是將集合進(jìn)行歸檔解檔,如:NSArray trueDeepCopyArray =[NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:oldArray]];
?? ? 6.為什么IBOutlet修飾的UIView也適用weak關(guān)鍵字?
?? ? A:因?yàn)榧热挥型怄溎敲匆晥D在xib或者storyboard中肯定存在,視圖已經(jīng)對(duì)它有一個(gè)強(qiáng)引用了。
?? ? 7. nonatomic和atomic的區(qū)別?atomic是絕對(duì)的線程安全么?為什么?如果不是,那應(yīng)該如何實(shí)現(xiàn)?
?? ? A:nonatomic和atomic的區(qū)別在于兩者自動(dòng)生成getter和setter的方法不一樣,如果你自己寫getter和setter方法,那么(getter,setter,retain,copy,assign)只起提示作用,寫不寫都一樣。
?? ? 對(duì)于atomic的屬性,系統(tǒng)生成的getter和setter會(huì)保證get,set的操作完整性,不受其他線程影響。比如線程A的getter方法運(yùn)行到一半,線程B調(diào)用了setter,那么線程A的getter還是能得到一個(gè)完整的對(duì)象。
?? ? 而nonatomic就沒有這個(gè)保證了,所以速度要比atomic快。
?? ? 不過atomic可不能保證線程安全,如果線程A調(diào)用了getter,與此同時(shí)線程B和線程C都調(diào)了setter,那最后線程Aget到的值,三種都有可能:可能是B,C set之前原始的值,也可能是B set的值,也可能是C set的值。同時(shí)這個(gè)最終的值,也可能是B set的值,也可能是C set的值。要保證安全,可以使用線程鎖。