基礎面試三

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

kvc

5、KVO

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

Socket
tcp

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的值鸽斟。要保證安全拔创,可以使用線程鎖。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末富蓄,一起剝皮案震驚了整個濱河市剩燥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌立倍,老刑警劉巖灭红,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侣滩,死亡現(xiàn)場離奇詭異,居然都是意外死亡比伏,警方通過查閱死者的電腦和手機胜卤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赁项,“玉大人葛躏,你說我怎么就攤上這事∮撇耍” “怎么了舰攒?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長悔醋。 經(jīng)常有香客問我摩窃,道長,這世上最難降的妖魔是什么芬骄? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任猾愿,我火速辦了婚禮拂蝎,結果婚禮上窥突,老公的妹妹穿的比我還像新娘。我一直安慰自己染突,他們只是感情好淘太,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布姻僧。 她就那樣靜靜地躺著,像睡著了一般蒲牧。 火紅的嫁衣襯著肌膚如雪撇贺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天冰抢,我揣著相機與錄音松嘶,去河邊找鬼。 笑死挎扰,一個胖子當著我的面吹牛喘蟆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鼓鲁,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼蕴轨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了骇吭?” 一聲冷哼從身側響起橙弱,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后棘脐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斜筐,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年蛀缝,在試婚紗的時候發(fā)現(xiàn)自己被綠了顷链。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡屈梁,死狀恐怖嗤练,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情在讶,我是刑警寧澤煞抬,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站构哺,受9級特大地震影響革答,放射性物質發(fā)生泄漏。R本人自食惡果不足惜曙强,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一残拐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧碟嘴,春花似錦蹦骑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽边败。三九已至袱衷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間笑窜,已是汗流浹背致燥。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留排截,地道東北人嫌蚤。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像断傲,于是被迫代替她去往敵國和親脱吱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容

  • iOS | 面試知識整理 - OC基礎 (一) 1. #include认罩、#import箱蝠、@class的區(qū)別? 在C...
    d76d0c9d2b04閱讀 400評論 0 2
  • category 和 extension 的區(qū)別? category :分類有名字,類擴展沒i有分類名字,是一種特...
    JonesCxy閱讀 295評論 0 1
  • 前言: 最近公司項目不怎么忙, 閑暇時間把iOS 在面試中可能會遇到的問題整理了一番, 一部分題目是自己面試遇到...
    Leon_520閱讀 16,355評論 10 138
  • category 和 extension 的區(qū)別? category :分類有名字宦搬,類擴展沒i有分類名字牙瓢,是一種特...
    WSGNSLog閱讀 176評論 0 1
  • 編譯鏈接的過程? 你知道哪些編碼方式间校? 程序在運行時操作系統(tǒng)除了分配內(nèi)存空間還有什么矾克? 內(nèi)核態(tài)和用戶態(tài)的區(qū)別? 堆...
    Crics閱讀 1,087評論 0 1