1蛾洛、簡述UIViewController的生命周期(注意:didReceiveMemoryWarning只有內(nèi)存警告才會走)
alloc -> init -> loadView->viewDidLoad->viewWillApper->viewDidApper->viewWillDisApper-didReceiveMemoryWarning->dealloc
2辐马、?import跟 include又什么區(qū)別,@class呢,#import<>跟# Import""又什么區(qū)別?
?#import是 Objective-C導入頭文件的關鍵字,?
include是C/C++導入頭文件的關鍵字。
使用# import頭文件會自動只導入一次,不會重復導入,相當于 #include和 #pragma once;
@class則告訴編譯器某個類的聲明,當執(zhí)行時,才去查看類的實現(xiàn)文件,可以解決頭文件的相互包含;
# import<>用來包含系統(tǒng)的頭文件,# import""用來包含用戶頭文件饿序。
3敞贡、鎖
4换淆、KVC
5、KVO
6真屯、HASH的特點:
? ? ? ? ? ? ? ? @1脸候、算法是公開的,@2绑蔫、對相同數(shù)據(jù)的運算运沦,得到的結果是一樣的,@3配深、對不同數(shù)據(jù)運算携添,如MD5得到的結果默認是128位,32個字符(16進制標識)@ 4、算法不能逆運算篓叶,@5烈掠、信息摘要,信息“指紋”缸托,是用來做數(shù)據(jù)識別的左敌。
用途:用戶密碼的加密、搜索引擎俐镐、版權矫限、數(shù)字簽名
密碼加密方式:直接使用MD5、MD5加鹽佩抹、HMAC加密方案奇唤、添加一點東西
對稱加密:明文通過秘鑰加密得到密文。密文通過秘鑰解密得到明文匹摇。
非對稱加密(RSA):分公鑰和私鑰,一般公鑰只能用來加密甲葬,私鑰只能用來解密和生成公鑰廊勃。加密速度比較低,私鑰由自己生成,再由私鑰生成公鑰坡垫,將公鑰分發(fā)出去
用戶注冊的時候:需要把用戶的密碼進行hash過后傳到后臺進行保存
用戶登錄密碼加密:1梭灿、服務器獲取key和密碼進行HMAC加密 +獲取當前的時間戳,然后進行hash冰悠,發(fā)給服務器
服務器:1堡妒、服務器獲取key和密碼進行HMAC加密 +獲取當前的時間戳(時間戳可能會有延遲,可以往后一分鐘進行拼接)溉卓,然后進行hash皮迟,然后把客戶端傳過來的字符串是否相同,相同就登錄成功桑寨,
7伏尼、Socket
8、weak與assign:weak一般在delegate中使用尉尾,解決循環(huán)引用問題爆阶,防止內(nèi)存泄露,因為修飾的對象釋放后沙咏,引用計數(shù)為0辨图,指針自動被置為nil,assign可修飾對象肢藐,和基本數(shù)據(jù)類型故河,修飾對象,會產(chǎn)生野指針問題窖壕;如果修飾基本數(shù)據(jù)類型則是安全的忧勿。修飾的對象釋放后,指針不會自動被置空瞻讽,此時向對象發(fā)消息會崩潰鸳吸。
copy與strong的區(qū)別?:在不可變的數(shù)據(jù)類型中都是淺拷貝速勇,而在可變的數(shù)據(jù)類型中strong是淺拷貝晌砾,而copy是深拷貝
深拷貝和淺拷貝的區(qū)別
?? ? 深拷貝:內(nèi)容拷貝,拷貝數(shù)據(jù)到一個新的內(nèi)存區(qū)域烦磁,兩個對象的值雖然相同养匈,但是內(nèi)存地址不一樣,兩個對象都不相關了
?? ? 淺拷貝:是拷貝原來對象的指針都伪,而內(nèi)存地址不變呕乎,當原來的指針對象值改變的時候,拷貝的指針對象的值也會變
?@property 這個關鍵詞的唯一作用就是聲明getter陨晶、setter方法接口
?@synthesize 實現(xiàn)setter猬仁、getter方法帝璧,找不到實例變量則主動創(chuàng)建一個:
? ? ? ? ? ? 例如:@synthesize proName =_proName
??@dynamic 語義是用戶要求自動生成setter getter方法,系統(tǒng)不會自動生成湿刽,;
?? ? atomic 默認屬性的烁。當前進程進行到一半,其他線程來訪問當前線程诈闺,可以保證先執(zhí)行完畢當前線程渴庆。只是保證setter/getter完整,不是線程安全雅镊。
?? ? nonatomic 非默認屬性襟雷。兩個線程同時訪問同一個屬性將會導致無法預計的結果。優(yōu)點是程序運行速度快漓穿。
?? ? retain 強應用類型嗤军,在ARC自動內(nèi)存管理時,相當于strong;
?autorelease:本質就是延遲調(diào)用release方法 晃危。底層主要數(shù)據(jù)結構是__AtAutoreleasePool叙赚,AutoreleasePoolPage
?? ? 最終都是通過AutoreleasePoolPage對象來管理的。
?? ? AutoreleasePool(自動釋放池)是 OC 中的一種內(nèi)存管理機制僚饭,它持有釋放池里的對象的所有權震叮,在自動釋放池銷毀時,統(tǒng)一給所有對象發(fā)送一次 release 消息鳍鸵。通過這個機制苇瓣,可以延遲對象的釋放。
?? ? autoreleasepool在何時被釋放偿乖?
?? ? Runloop創(chuàng)建的AutoreleasePool击罪,只會在Runloop即將休眠或退出的時候銷毀,這時候池中的對象才會被釋放
?? ? 說一下iOS內(nèi)存分區(qū)情況贪薪?
?? ? 內(nèi)存其實分為五大分區(qū)媳禁,棧區(qū)(系統(tǒng)管理的地方)、堆區(qū)(程序員控制的地方)画切、常量區(qū)(全局區(qū))竣稽、靜態(tài)區(qū)和代碼區(qū),
?? ? 棧區(qū):棧是編譯器自動分配釋放來管理內(nèi)存霍弹,用戶存放程序臨時創(chuàng)建的變量毫别、函數(shù)值等,由于棧的先進后出的特點典格,特別適合保存恢復當前的代碼塊區(qū)域操作
?? ? 堆區(qū):是由程序員分配和釋放岛宦,(程序不釋放,可能會導致內(nèi)存泄露)耍缴,是動態(tài)分配內(nèi)存段恋博,大小不固定齐佳,可動態(tài)擴張和縮放
? ? ? ? ? ? ? ? 堆區(qū)的內(nèi)存分配使用的是alloc,ARC的內(nèi)存管理债沮,是編譯器在編譯的時候自動添加retain,release本鸣,autorelease疫衩,堆區(qū)的地址是從低到高
?? ? 常量區(qū):常量存儲區(qū)是一塊比較特殊的存儲區(qū),存放的都是常量
?? ? 全局靜態(tài)區(qū):分為數(shù)據(jù)區(qū)和bss區(qū)荣德,數(shù)據(jù)區(qū)存放可執(zhí)行文件中已經(jīng)初始化的全局變量闷煤,bss區(qū)存放的是未初始化的全局變量和未初始化的靜態(tài)變量
?? ? 代碼區(qū):就是存放APP代碼,防止運行時被修改涮瞻,所以只能讀取鲤拿,不能寫入
?iOS 如何解決循環(huán)引用?
? ? ? ? 1.在delegate中用weak弱引用
? ? ? ? 2署咽、block:使用__weak typeof(self) weakSelf = self;打斷循環(huán)引用近顷,如果擔心對象在block中提前釋放:用 __strong typeof (self) strongSelf = weakSelf;
? ? ? ? 3、定時器(NSTimer),在何時的地方將其invalidate并置為nil即可
runloop和線程的關系宁否?
? ? ? ? runloop和線程是一一對應的關系窒升,主線程的runloop是自動開啟的,子線程需要手動開啟([[NSRunLoop currentRunLoop]run])
? ? ? ? isa指針的理解慕匠,對象isa指針指向哪里饱须?
? ? ? ? isa指針指向等價于 is kind of
? ? ? ? 實例對象isa指向類對象、類對象的isa指向元類對象台谊、元類對象的isa指向元類的基類
? ? ? ? 兩種類型:isa指針蓉媳,superclass指針
Runtime是怎么實現(xiàn)weak?
?? ? Runtime對注冊的類會進行布局锅铅,對于weak對象會放入一個hash表中酪呻,用weak指向的“對象的內(nèi)存地址”作為key,當對象的引用計數(shù)為0的時調(diào)用dealloc方法狠角,此時會在weak表中搜索号杠,將所有weak對象置為nil;
? ? ? ? Runtime是一套C語言的API,,編寫的OC代碼都是轉換成Runtime_API進行調(diào)用
?? ? OC是動態(tài)時語言:在運行時確定一個對象的類型丰歌,調(diào)用那個對象的方法姨蟋,都需要Runtime來做類和對象的動態(tài)創(chuàng)建,消息傳遞和消息轉發(fā)
?? ? load 和 initialize的區(qū)別立帖?
?? ? initalize該類只調(diào)用一次眼溶,load是每次進入該類都會調(diào)用
?iOS 中造成tableView卡頓的原因都有哪些呢?
?? ? 1晓勇、沒有使用cell的重用標識符堂飞,導致一直創(chuàng)建新的cell
?? ? 2灌旧、每次cell的重新布局
?? ? 3、沒有提前計算并緩存cell的屬性及內(nèi)容
?? ? 4绰筛、加載網(wǎng)絡數(shù)據(jù)枢泰,下載圖片,沒有使用異步加載和緩存圖片
?? ? 5铝噩、沒有做緩存行高衡蚂,每次都需要計算行高
? ? ? ? 如何降低APP包的大小骏庸?
? ? ? ? 刪除不必要的圖片毛甲,刪除不需要的類文件,刪除項目中沒有用到的庫文件具被,刪除不需要的資源文件
?? ? iOS內(nèi)存泄露排查方法玻募?
? ? ? ? 內(nèi)存泄露是指申請的內(nèi)存空間使用完成之后沒有及時回收,導致頁面不釋放一姿,從而加劇內(nèi)存暴增
? ? ? ? ? ? 靜態(tài)內(nèi)存泄露分析方法:通過xcode打開項目,點擊Product,在下拉菜單中點擊Analyze就可以進行靜態(tài)內(nèi)存泄漏分析
? ? ? ? ? ? 動態(tài)分析:Instrument中的Leaks來分析
?? ? iOS常見的項目設計模式:MVC七咧,MVVM
? ? iOS 結構設計模式:KVO、KVC啸蜜、橋接模式坑雅、單利模式、代理模式
?什么是多線程衬横?
?? ? 即1個進程中可以開啟多條線程裹粤,每條線程可以同時執(zhí)行不同的任務。
?? ? 一蜂林、多線程的優(yōu)缺點:
?? ? 優(yōu)點: 1.能適當提高程序的執(zhí)行效率? 2.能適當提高資源的利用率(cpu遥诉,內(nèi)存); 3.線程上的任務執(zhí)行完成之后噪叙,線程會自動銷毀矮锈;
?? ? 缺點: 1.開啟線程需要占用一定的內(nèi)存空間(默認占用512KB); 2.開啟大量的線程睁蕾,會占用大量的內(nèi)存空間苞笨,降低程序的性能;
?? ? ? ? ? 3.線程越多子眶,cpu在調(diào)用線程上的開銷就越大瀑凝;4.程序設計更加復雜,比如線程間的通信臭杰,多線程的數(shù)據(jù)共享
? ? ? ? 如何保證線程的安全粤咪?:線程加鎖
?? ? 線程中的死鎖?
?? ? 死鎖形成的原因:
?? ? 系統(tǒng)資源不足
?? ? 進程(線程)推進的順序不恰當渴杆;
?? ? 資源分配不當
?? ? 死鎖形成的條件:
?? ? 互斥條件:一個資源每次只能被一個進程使用
?? ? 占有且等待:一個進程因請求資源而阻塞時寥枝,對已獲得的資源保持不放宪塔。
?? ? 不剝奪條件:進程已獲得資源,在末使用完之前囊拜,不能強行剝奪某筐。
?? ? 循環(huán)等待條件:若干進程之間形成一種頭尾相接的循環(huán)等待資源關系。
1. 為什么說Objective-C是一門動態(tài)的語言冠跷?4.如何令自己所寫的對象具有拷貝功能?
? ? ? ? 因為Objective—C可以通過Runtime這個運行機制来吩,在運行時動態(tài)的添加變量、方法蔽莱、類等
? ? 2、為什么代理要用weak戚长?代理的delegate和dataSource有什么區(qū)別盗冷?block和代理的區(qū)別?
?? ? ? 防止循環(huán)引用 ,delegate偏重于與用戶交互的回調(diào)同廉,datasource偏重于數(shù)據(jù)的返回
? ? ? ? 區(qū)別在于:代理傾向于過程仪糖,block傾向于結果。.代理書寫起來繁瑣一些迫肖,block很便捷锅劝。代理運行成本低,block運行成本高蟆湖。優(yōu)先使用block(單次故爵,或回調(diào)很少,不頻繁)隅津,如果需要頻繁的回調(diào)诬垂,數(shù)量比較多的回調(diào),例如tableView的代理方法伦仍,界面滾動的時候會反復調(diào)用结窘,就適合用代理。單次充蓝,或者比較少的回調(diào)適合用block隧枫。有利于優(yōu)化性能。
?? ? A:屬性的本質是@property = ivar+getter+setter,也就是說@property系統(tǒng)會自動生成getter和setter方法谓苟。屬性默認的關鍵字包括atomic官脓,nonatomic,@synthesize娜谊,@dynamic确买,getter=getterName,setter=setterName纱皆,readwrite湾趾,readonly芭商,assign,retain搀缠,copy铛楣。
?? ? @dynamic:表示變量對應的屬性訪問器方法,是動態(tài)實現(xiàn)的艺普,你需要在 NSObject 中繼承而來的 +(BOOL) resolveInstanceMethod:(SEL) sel 方法中指定 動態(tài)實現(xiàn)的方法或者函數(shù)簸州。
?? ? @synthesize:如果沒有實現(xiàn)setter和getter,編譯器能夠自動實現(xiàn)getter和setter方法歧譬。
?? ? A:若想讓自己寫的對象具有拷貝功能岸浑,則需要實現(xiàn)NSCopying協(xié)議。如果自定義的對象分為可變版本和非可變版本瑰步,那么就要同時實現(xiàn)NSCopying和NSMutableCopying協(xié)議矢洲,不過一般沒什么必要,實現(xiàn)NSCopying協(xié)議就夠了缩焦。
?? ? 5.可變集合類 和 不可變集合類的 copy 和 mutablecopy有什么區(qū)別读虏?如果是集合是內(nèi)容復制的話,集合里面的元素也是內(nèi)容復制么袁滥?
?? ? A:對于不可變對象盖桥,copy操作是淺復制,mutableCopy是深復制题翻。對于不可變對象揩徊,mutableCopy不僅僅是深復制,返回的對象類型還是不可變對象類型相應的可變對象的類型藐握。內(nèi)容復制也就是深拷貝靴拱,集合的深復制有兩個方法,可以用initWithArray:copyItems:將第二個參數(shù)設置為YES即可進行深復制猾普,如:NSDictionary shallowCopyDict =[NSDictionary alloc]initWithDictionary:someDictionary copyItems:YES];如果用這個方法深復制袜炕,集合里的每個元素都會收到copyWithZone:消息。如果集合里的對象遵循NSCopying協(xié)議初家,那么對象就會深復制到新的集合偎窘。如果對象沒有遵循NSCopying協(xié)議,而嘗試用這種方法進行深復制則會出錯溜在。copyWithZone:這種拷貝方式只能提供一層內(nèi)存拷貝陌知,而非真正的深拷貝。第二種方法是將集合進行歸檔解檔掖肋,如:NSArray trueDeepCopyArray =[NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:oldArray]];
?? ? 6.為什么IBOutlet修飾的UIView也適用weak關鍵字仆葡?
?? ? A:因為既然有外鏈那么視圖在xib或者storyboard中肯定存在,視圖已經(jīng)對它有一個強引用了。
?? ? 7. nonatomic和atomic的區(qū)別沿盅?atomic是絕對的線程安全么把篓?為什么?如果不是腰涧,那應該如何實現(xiàn)韧掩?
?? ? A:nonatomic和atomic的區(qū)別在于兩者自動生成getter和setter的方法不一樣,如果你自己寫getter和setter方法窖铡,那么(getter疗锐,setter,retain费彼,copy滑臊,assign)只起提示作用,寫不寫都一樣箍铲。
?? ? 對于atomic的屬性简珠,系統(tǒng)生成的getter和setter會保證get,set的操作完整性虹钮,不受其他線程影響。比如線程A的getter方法運行到一半膘融,線程B調(diào)用了setter芙粱,那么線程A的getter還是能得到一個完整的對象。
?? ? 而nonatomic就沒有這個保證了氧映,所以速度要比atomic快春畔。
?? ? 不過atomic可不能保證線程安全,如果線程A調(diào)用了getter岛都,與此同時線程B和線程C都調(diào)了setter律姨,那最后線程Aget到的值,三種都有可能:可能是B臼疫,C set之前原始的值择份,也可能是B set的值,也可能是C set的值烫堤。同時這個最終的值荣赶,也可能是B set的值,也可能是C set的值鸽斟。要保證安全拔创,可以使用線程鎖。