技術面試和筆試資料

P4

QA1、隊列和棧有什么區(qū)別荸哟?

隊列和棧是兩種不同的數(shù)據(jù)容器假哎。
隊列是一種先進先出的數(shù)據(jù)結構;
它在兩端進行操作鞍历,一端進行入隊列操作舵抹,一端進行出列隊操作;
隊列是基于地址指針進行遍歷劣砍,而且可以從頭部或尾部開始遍歷惧蛹,但不能同時遍歷,無需開辟臨時空間刑枝,因為在遍歷的過程中不影響數(shù)據(jù)結構香嗓,速度要快的多。
棧是一種先進后出的數(shù)據(jù)結構装畅;
它只能在棧頂進行操作靠娱,入棧和出棧都在棧頂操作;
棧只能從頭部取數(shù)據(jù)也就最先放入的需要遍歷整個棧最后才能取出來掠兄,而且在遍歷數(shù)據(jù)的時候還得為數(shù)據(jù)開辟臨時空間像云,保持數(shù)據(jù)在遍歷前的一致性,速度較慢徽千。

QA2苫费、常見的object-c的數(shù)據(jù)類型有那些,和C的基本數(shù)據(jù)類型有什么區(qū)別双抽?

object-c的數(shù)據(jù)類型有NSString百框,NSNumber,NSArray牍汹,NSMutableArray铐维,NSData等等,這些都是class慎菲,創(chuàng)建后便是對象嫁蛇,而C語言的基本數(shù)據(jù)類型int,只是一定字節(jié)的內(nèi)存空間露该,用于存放數(shù)值睬棚;而object-c的NSNumber包含有父類NSObject的方法和NSNumber自己的方法,可以完成復雜的操作。

QA3抑党、請簡述UITableView的復用機制包警。

每次創(chuàng)建cell的時候通過dequeueReusableCellWithIdentifier:方法創(chuàng)建cell,它先到緩存池中找指定標識的cell底靠,如果沒有就直接返回nil害晦。
如果沒有找到指定標識的cell,那么會通過initWithStyle:reuseIdentifier:創(chuàng)建一個cell暑中。
當cell離開界面就會被放到緩存池中壹瘟,以供下次復用。

QA4鳄逾、@class和import以及include的區(qū)別稻轨?

import會引入整個.h頭文件。
@class只是告訴編譯器該類中可以使用這個class類名严衬。

QA5澄者、屬性關鍵字assign、retain请琳、weak粱挡、copy的類型區(qū)別?

assign:用于基本數(shù)據(jù)類型和結構體俄精。如果修飾對象的話刨肃,當銷毀時剂府,屬性值不會自動置nil玉控,可能造成野指針敞葛。
weak:對象引用計數(shù)為0時,屬性值也會自動置nil
retain:強引用類型圾旨,ARC下相當于strong踱讨,但block不能用retain修飾,因為等同于assign不安全砍的。
strong:強引用類型痹筛,修飾block時相當于copy。

QA6廓鞠、單例實例是什么?

Foundation 和Application Kit 框架中的一些類只允許創(chuàng)建單例對象帚稠,即這些類在當前進程中的唯一實例。

QA7床佳、簡述iOS中的ARC內(nèi)存管理方式滋早。

iOS的ARC內(nèi)存管理用的是自動引用計數(shù)的方法。
ARC:開發(fā)者通過聲明對象的屬性為strong,weak,retain,assign來管理對象的引用計數(shù)砌们,被strong和retain修飾的屬性變量系統(tǒng)會自動對所修飾變量的引用計數(shù)進行自增自減操作杆麸,同樣地搁进,retainCount為0時,系統(tǒng)會釋放對象內(nèi)存角溃。

QA8拷获、什么是深拷貝與淺拷貝?

深拷貝就是開辟一塊新的內(nèi)存空間來存儲原來內(nèi)存空間的內(nèi)容减细,對象指針指向新的內(nèi)存空間。
淺拷貝只是重新生成一個指針赢笨,指向的還是原來的內(nèi)存空間未蝌。

QA9、淺拷貝和深拷貝的區(qū)別?

深拷貝開辟了新的內(nèi)存空間茧妒,淺拷貝內(nèi)存空間不變萧吠。
深拷貝不改變當前對象的引用計數(shù),而淺拷貝是會改變桐筏。

QA10纸型、NSArray與NSSet的區(qū)別?

NSArray內(nèi)存中存儲地址連續(xù)梅忌,而NSSet不連續(xù)狰腌;
NSSet效率高,內(nèi)部使用hash查找牧氮;
NSArray查找需要遍歷琼腔;
NSSet通過anyObject訪問元素,NSArray通過下標訪問踱葛;

P5

QA11丹莲、@protocol 和category 中如何使用@property?

在protocol 中使用property 只會生成setter 和getter 方法聲明尸诽,我們使用屬性的目的甥材,是希望遵守協(xié)議的對象能實現(xiàn)該屬性。
category 使用@property 也是只會生成setter 和getter 方法的聲明性含,如果我們真的需要給category 增加屬性的實現(xiàn)洲赵,需要借助于運行時的兩個函數(shù):objc_setAssociatedObject 與objc_getAssociatedObject

QA12、一個objc對象的isa的指針指向什么胶滋?有什么作用板鬓?

isa 指向他的類對象,從而可以找到對象上的方法究恤。
同一個類的不同對象俭令,他們的isa指針是一樣的。

QA13部宿、IBOutlet連出來的視圖屬性為什么可以被設置成weak?

因為父控件的subViews數(shù)組已經(jīng)對它有一個強引用抄腔。

QA14瓢湃、簡述iOS內(nèi)存分區(qū)情況。

代碼區(qū):存放函數(shù)二進制代碼赫蛇。
數(shù)據(jù)區(qū):系統(tǒng)運行時申請內(nèi)存并初始化绵患,系統(tǒng)退出時由系統(tǒng)釋放。用來存放全局變量悟耘、靜態(tài)變量落蝙、常量。
堆區(qū):通過malloc等函數(shù)或new等操作符動態(tài)申請得到暂幼,需程序員手動申請和釋放筏勒。
棧區(qū):函數(shù)模塊內(nèi)申請,函數(shù)結束時由系統(tǒng)自動釋放旺嬉。存放局部變量管行、函數(shù)參數(shù)。

QA15邪媳、沙盒目錄結構是怎樣的捐顷?各自用于那些場景?

一級目錄:Application雨效、Documents迅涮、tmp、Library
Application:存放程序源文件设易,上架前經(jīng)過數(shù)字簽名逗柴,上架后不可修改。
Documents:常用目錄顿肺,iCloud備份目錄戏溺,存放數(shù)據(jù)。
tmp:存放臨時文件屠尊,不會被備份旷祸,而且這個文件下的數(shù)據(jù)有可能隨時被清除的可能。
Library:包含二級目錄Caches和Preference讼昆。
Caches:存放體積大又不需要備份的數(shù)據(jù)托享。
Preference:設置目錄,iCloud會備份設置信息浸赫。

QA16闰围、通知,代理既峡,block羡榴,KVO的使用場景分別是什么,有什么區(qū)別运敢?

通知:適用于毫無關聯(lián)的頁面之間或者系統(tǒng)消息的傳遞校仑,屬于一對多的信息傳遞關系忠售。
代理:一對一的信息傳遞方式,適用于相互關聯(lián)的頁面之間的信息傳遞迄沫。
block:一對一的信息傳遞方式稻扬,效率會比代理要高。
KVO:屬性監(jiān)聽羊瘩,監(jiān)聽對象的某一屬性值的變化狀況泰佳,當需要監(jiān)聽對象屬性改變的時候使用。

QA17尘吗、NSTimer計時器是準確的嗎乐纸,為什么?

NSTimer計時器不是準確的摇予。
原因:定時器被添加在主線程中,由于定時器在一個RunLoop中被檢測一次吗跋,所以如果在這一次的RunLoop中做了耗時的操作侧戴,當前RunLoop持續(xù)的時間超過了定時器的間隔時間,那么下一次定時就被延后了跌宛。

QA18酗宋、類的分類和類的擴展的區(qū)別?

類的分類可以動態(tài)添加方法(運行時)疆拘,類的擴展可以添加更多的屬性變量(編譯期)蜕猫。

QA19、http和https的區(qū)別哎迄?

http:// https在http的基礎上增加了SSL數(shù)據(jù)傳輸安全性認證層回右。
http:// https協(xié)議需要到ca申請證書。
http是超文本傳輸協(xié)議漱挚,信息是明文傳輸翔烁,https 則是具有安全性的ssl加密傳輸協(xié)議。
http和https使用的是完全不同的連接方式用的端口也不一樣旨涝,前者是80蹬屹,后者是443。
http的連接很簡單白华,是無狀態(tài)的慨默。
HTTPS協(xié)議是由SSL+HTTP協(xié)議構建的可進行加密傳輸、身份認證的網(wǎng)絡協(xié)議弧腥。

QA20厦取、iOS的retain和release的操作是在編譯期還是運行時進行的?

retain和release是在編譯期由編譯器自動生成的代碼鸟赫。

QA21蒜胖、UIViewController的生命周期方法調(diào)用順序

alloc 創(chuàng)建對象消别,分配空間。
init 初始化對象台谢,初始化數(shù)據(jù)寻狂。
loadView 從nib載入視圖。
viewDidLoad 載入完成朋沮,可以進行自定義數(shù)據(jù)以及動態(tài)的創(chuàng)建其他控件蛇券。
viewWillAppear 視圖將出現(xiàn)在屏幕之前。
viewDidAppear 視圖在屏幕上渲染完成樊拓。
當一個視圖被移除屏幕并且銷毀的時候執(zhí)行順序:
viewWillDisappear 視圖被移除之前纠亚。
viewDidDisappear 視圖被移除之后。
dealloc 銷毀視圖筋夏。

QA22蒂胞、如何化解ViewController和NSTimer的循環(huán)引用關系?

NSTimer和使用Timer的ViewController相互持有會引起循環(huán)引用条篷。
方法1:在ViewContoller的viewWillDisappear生命周期中注銷Timer骗随。
方法2:引入第三方NSObject管理和持有Timer,讓Timer持有第三方的成員變量赴叹。這樣就打破了互相引用的循環(huán)關系鸿染。

QA23、描述數(shù)據(jù)持久化的幾種方式和對應的應用場景乞巧?

plist文件(屬性列表):即直接拖拽plist文件到程序目錄當中涨椒。由NSBundle獲取本地plist資源。存儲一些本地的绽媒,且不會改變的數(shù)據(jù)到程序當中蚕冬。
preference(偏好設置):即NSUserDefaults,存儲一些小型數(shù)據(jù)些椒,設置參數(shù)播瞳,開關屬性等等。
NSKeyedArchiver(歸檔):存儲一些不涉及增刪改查的字典數(shù)組或者NSObject等免糕,存儲的對象一定要遵循NSCoder和NSDecoder協(xié)議赢乓。
SQLite:存儲一些涉及增刪改查的字段數(shù)據(jù)。
CoreData:效率比較高石窑,存儲一些涉及增刪改查的且體積非常大的數(shù)據(jù)牌芋。

QA24、如何進行網(wǎng)絡消息推送松逊?

一種是Apple自己提供的通知服務(APNS服務器)躺屁、一種是用第三方推送機制。
首先應用發(fā)送通知经宏,系統(tǒng)彈出提示框詢問用戶是否允許犀暑,當用戶允許后向蘋果服務器(APNS)請求deviceToken驯击,并由蘋果服務器發(fā)送給自己的應用,自己的應用將DeviceToken發(fā)送自己的服務器耐亏,自己服務器想要發(fā)送網(wǎng)絡推送時將deviceToken以及想要推送的信息發(fā)送給蘋果服務器徊都,蘋果服務器將信息發(fā)送給應用。

第三方推送機制广辰,普遍使用Socket機制來實現(xiàn)暇矫,幾乎可以達到即時的發(fā)送到目標用戶手機端,適用于即時通訊類應用择吊。

QA25李根、TCP和UDP的區(qū)別與聯(lián)系?

TCP為傳輸控制層協(xié)議几睛,為面向連接房轿、可靠的、點到點的通信所森;
UDP為用戶數(shù)據(jù)報協(xié)議冀续,非連接的不可靠的點到多點的通信;
TCP側重可靠傳輸必峰,UDP側重快速傳輸。

QA26钻蹬、HTTPS的加密原理吼蚁?

服務器端用非對稱加密(RSA)生成公鑰和私鑰,
然后把公鑰發(fā)給客戶端, 服務器則保存私鑰问欠;
客戶端拿到公鑰后, 會生成一個密鑰, 這個密鑰就是將來客戶端和服務器用來通信的鑰匙肝匆;
然后客戶端用公鑰對密鑰進行加密, 再發(fā)給服務器;
服務器拿到客戶端發(fā)來的加密后的密鑰后, 再使用私鑰解密密鑰, 到此雙方都獲得通信的鑰匙顺献。

QA27旗国、如何高性能的給 UIImageView 加個圓角?

解決方案:
1、設置Calayer的cornerRadius和masksToBounds(會導致離屏渲染)
2注整、使用繪圖技術繪制圓角能曾。
3、使用貝塞爾曲線"切割"個這個圖片, 給UIImageView 添加圓角肿轨。

QA28寿冕、UIView 和CAlayer 是什么關系?

UIView可以響應事件,CALayer不可以椒袍。
UIView是CALayer的delegate驼唱。UIView主要處理事件,CALayer負責繪制驹暑。
每個 UIView 內(nèi)部都有一個 CALayer 在背后提供內(nèi)容的繪制和顯示玫恳,并且 UIView 的尺寸樣式都由內(nèi)部的CALayer 所提供辨赐。

QA29、用@property聲明的 NSString / NSArray / NSDictionary 經(jīng)常使用 copy 關鍵字京办,為什么掀序?

使用copy的目的是,防止把可變類型的對象賦值給不可變類型的對象時臂港,可變類型對象的值發(fā)生變化會無意間篡改不可變類型對象原來的值森枪。

QA30、如果用strong關鍵字@property聲明的 NSString / NSArray / NSDictionary审孽,有什么問題县袱?

用 @property 聲明 NSString、NSArray佑力、NSDictionary有對應的可變類型:NSMutableString式散、NSMutableArray、 NSMutableDictionary打颤。如果我們使用是 strong暴拄,那么這個屬性就有可能指向一個可變對象,如果這個可變對象在外部被修改了编饺,那么會影響該屬性乖篷。

QA31、單例使用的優(yōu)缺點透且?

主要優(yōu)點:
1撕蔼、提供了對唯一實例的受控訪問。
2秽誊、由于在系統(tǒng)內(nèi)存中只存在一個對象鲸沮,因此可以節(jié)約系統(tǒng)資源,對于一些需要頻繁創(chuàng)建和銷毀的對象單例模式無疑可以提高系統(tǒng)的性能锅论。
3讼溺、允許可變數(shù)目的實例。
主要缺點:
1最易、由于單利模式中沒有抽象層怒坯,因此單例類的擴展有很大的困難。
2藻懒、單例類的職責過重敬肚,在一定程度上違背了“單一職責原則”。
3束析、濫用單例將帶來一些負面問題艳馒,如系統(tǒng)回收后對象狀態(tài)的丟失。

QA32、原子(atomic)跟非原子(non-atomic)屬性有什么區(qū)別

atomic提供多線程安全弄慰。是防止在寫未完成的時候被另外一個線程讀取第美,造成數(shù)據(jù)錯誤。
non-atomic:在自己管理內(nèi)存的環(huán)境中陆爽,解析的訪問器保留并自動釋放返回的值什往,如果指定了 nonatomic ,那么訪問器只是簡單地返回這個值慌闭。

QA33别威、談談id和instancetype的異同?

相同點: 兩者都是可以作為方法的返回值類型驴剔。
不同點:
instancetype可以返回和方法所在類相同類型的對象省古,id只能返回的是未知類型的對象。
instancetype不能作為函數(shù)的參數(shù)丧失,只能作為返回值豺妓。

QA34、如何選擇delegate布讹、notification琳拭、KVO?

三種模式都是一個對象傳遞事件給另外一個對象描验。
delegate:一對一白嘁。
notification:一對多或者多對多。
KVO:一對一膘流。

三者各有自己的特點:
delegate:語法簡潔权薯,方便閱讀,易于調(diào)試睡扬。
notification:靈活多變,可以跨越多個類之間進行使用黍析。
KVO:實現(xiàn)屬性監(jiān)聽卖怜,實現(xiàn)model和view同步。

QA35阐枣、Runloop的作用是什么马靠?

作用:保持程序的持續(xù)運行、隨時處理各種事件蔼两、節(jié)省cpu資源(沒事件休息釋放資源)甩鳄、渲染屏幕UI。

QA36额划、iOS的簽名機制大概是怎么樣的妙啃?

先將應用內(nèi)容通過摘要算法,得到摘要再用私鑰對摘要進行加密得到密文,將源文本揖赴、密文馆匿、和私鑰對應的公鑰一并發(fā)布。查看公鑰是否是私鑰方的燥滑,然后用公鑰對密文進行解密得到摘要渐北,將APP用同樣的摘要算法得到摘要,兩個摘要進行比對铭拧,如果相等那么則校驗正常赃蛛。

QA37、weak屬性如何自動置nil的搀菩?

Runtime會對weak屬性進行內(nèi)存布局呕臂,構建hash表:以weak屬性對象內(nèi)存地址為key,weak屬性值(weak自身地址)為value秕磷。當對象引用計數(shù)為0 dealloc時诵闭,會將weak屬性值自動置nil。

QA38澎嚣、iOS中使用的鎖有哪幾種疏尿?

@synchronized、信號量易桃、NSLock等褥琐。

QA39、iOS中如何導致死鎖的產(chǎn)生晤郑?

多個線程同時訪問同一資源敌呈,造成循環(huán)等待。

QA40造寝、訪問控制關鍵字(public磕洪、open、private诫龙、filePrivate析显、internal)的區(qū)別?

public與open:public在module內(nèi)部中签赃,class和func都可以被訪問/重載/繼承谷异,外部只能訪問;而open都可以锦聊。
private與filePrivate:private修飾class/func歹嘹,表示只能在當前class源文件/func內(nèi)部使用,外部不可以被繼承和訪問孔庭;而filePrivate表示只能在當前swift源文件內(nèi)訪問尺上。
internal:在整個模塊或者app內(nèi)都可以訪問,默認訪問級別,可寫可不寫尖昏。

QA41仰税、Autorelease對象什么時候釋放?

在沒有手加Autorelease Pool的情況下抽诉,Autorelease對象是在當前的runloop迭代結束時釋放的陨簇,而它能夠釋放的原因是系統(tǒng)在每個runloop迭代中都加入了自動釋放池Push和Pop。

QA42迹淌、runtime 中河绽,SEL和IMP的區(qū)別?

每個類對象都有一個方法列表,方法列表存儲方法名唉窃、方法實現(xiàn)耙饰、參數(shù)類型,SEL是方法名(編號)纹份,IMP指向方法實現(xiàn)的首地址

QA43苟跪、load方法和initialize方法的異同?——主要說一下執(zhí)行時間,各自用途蔓涧,沒實現(xiàn)子類的方法會不會調(diào)用父類的件已?

load和initialize的調(diào)用時機:load是在app啟動后,initialize是在runtime初始化的時候元暴,第一個方法調(diào)用前調(diào)用篷扩。
調(diào)用順序:load是父類->本類->分類的調(diào)用順序,initialize是父類->本類的調(diào)用順序(如果有分類直接調(diào)用分類茉盏,本類不會調(diào)用)
沒實現(xiàn)子類的方法會不會調(diào)用父類的鉴未? 不會
是否沿用父類實現(xiàn)? 否

QA44鸠姨、KVO底層實現(xiàn)原理铜秆?

當觀察一個對象時,runtime會動態(tài)創(chuàng)建繼承自該對象的類讶迁,并重寫被觀察對象的setter方法连茧,重寫的setter方法會負責在調(diào)用原setter方法前后通知所有觀察對象值得更改,最后會把該對象的isa指針指向這個創(chuàng)建的子類添瓷,對象就變成子類的實例。

QA45值纱、@property (nonatomic, copy) NSMutableArray *array; 這種寫法會出什么問題鳞贷?

當對數(shù)組array進行添加, 刪除等操作時虐唠, 程序會因為找不到對應的實例方法而崩潰搀愧。
原因: 當對array進行copy操作后, 就是復制了一個不可變的NSArray對象,不能對NSArray對象進行添加,刪除等操作咱筛。

QA46搓幌、如何實現(xiàn)OC與JS交互?

1迅箩、通過對象方法攔截url
2溉愁、使用JavaScriptCore(只適用于UIWebView)
3、使用WKScriptMessageHandler(只適用于WKWebView)
4饲趋、使用像WebViewJavaScriptBridge的第三方框架

QA47拐揭、-(BOOL)isKindOfClass和-(BOOL)isMemberOfClass的區(qū)別?

-(BOOL) isKindOfClass: classObj 判斷是否是這個類或者這個類的子類的實例
-(BOOL) isMemberOfClass: classObj 判斷是否是這個類的實例

P6

QA48奕塑、nil, Nil, NSNULL, NULL的區(qū)別堂污?

nil是指向obj-c中對象的空指針,是一個對象龄砰,在o-c中nil對象調(diào)用方法不會引起crash盟猖。
Nil是指向obj-c中的類的空指針,表示的是一個空類换棚。
NULL是指向任何類型的空指針(如c/c++中的空指針)式镐,在objective -c中是一個數(shù)值。
NSNULL用于集合操作圃泡,在集合對象中碟案,表示一個空值的集合對象。

QA49颇蜡、如何監(jiān)聽View的觸摸事件价说?

復寫View類的touchBegin、touchMove风秤、touchEnd系列方法監(jiān)聽視圖的觸摸鳖目。

QA50、事件是如何傳遞的缤弦?

事件傳遞:當觸摸一個視圖時领迈,首先系統(tǒng)會捕捉此事件,并為此事件創(chuàng)建一個UIEvent對象碍沐,將此對象加入當前應用程序的事件隊列中狸捅,然后由UIApplication對象從隊列中,一個一個取出來進行分發(fā)累提,首先分發(fā)給UIWindow對象尘喝,然后由UIWindow對象分發(fā)給觸摸的視圖對象,也就是第一響應者對象斋陪。

QA51朽褪、視圖的響應鏈是什么?

響應者鏈:事件被交由第一響應者對象處理置吓,如果第一響應者不處理,事件被沿著響應者鏈向上傳遞缔赠,交給下一個響應者(next responder)衍锚。

QA52、描述下SDWebImage里面給UIImageView加載圖片的邏輯嗤堰。

第一步:首先會在SDWebImageCache 中尋找圖片是否有對應的緩存, 它會以url 作為數(shù)據(jù)的索引先在內(nèi)存中尋找是否有對應的緩存戴质。
第二步:如果緩存未找到就會利用通過MD5處理過的key來繼續(xù)在磁盤中查詢對應的數(shù)據(jù), 如果找到了, 就會把磁盤中的數(shù)據(jù)加載到內(nèi)存中,并將圖片顯示出來梁棠。
第三步:如果在內(nèi)存和磁盤緩存中都沒有找到置森,就會向遠程服務器發(fā)送請求,開始下載圖片符糊。
下載后的圖片會加入緩存中凫海,并寫入磁盤中。
整個獲取圖片的過程都是在子線程中執(zhí)行男娄,獲取到圖片后回到主線程將圖片顯示出來行贪。

QA53、Cookie和Session的區(qū)別模闲?

存儲位置:Cookie存放在客戶端上建瘫,Session數(shù)據(jù)存放在服務器上。
Session 的運行依賴session id尸折,而session id 是存在Cookie 中的啰脚,也就是說,如果瀏覽器禁用了Cookie 实夹,同時Session 也會失效橄浓。
安全性:Cookie存在瀏覽器中,可能會被一些程序復制亮航,篡改荸实;而Session存在服務器相對安全很多。
性能:Session會在一定時間內(nèi)保存在服務器上缴淋,當訪問增多准给,會對服務器造成一定的壓力≈囟叮考慮到減輕服務器壓力露氮,應當使用Cookie。

QA54钟沛、GCD與NSOperation兩種管理多線程方式的異同點畔规?

GCD是用C語言實現(xiàn)的,而NSOperation是用OC實現(xiàn)的讹剔。
NSOperation可以設置最大線程并發(fā)數(shù)油讯,可以設置線程依賴關系,可以設置線程的優(yōu)先級延欠。
GCD方式管理多線程是一種對開發(fā)者非常友好的開發(fā)方式陌兑,開發(fā)者只需要關注同步異步,串行并發(fā)這些線程關系就可以輕松地進行線程管理了由捎。

QA55兔综、MJExtension的原理?

通過運行時狞玛,拿到Model對應的PropertyName软驰,然后通過KVC,將字典中的值傳入Model心肪。

QA56锭亏、iOS 以scheduledTimerWithTimeInterval的方式觸發(fā)的timer,在滑動頁面上的列表時硬鞍,timer會暫停慧瘤,為什么?該如何解決固该?

方法一:是將timer加入到NSRunloopCommonModes中锅减。
方法二:是將timer放到另一個線程中,然后開啟另一個線程的runloop伐坏,這樣可以保證與主線程互不干擾怔匣,而現(xiàn)在主線程正在處理頁面滑動。

QA57桦沉、怎么防止反編譯每瞒?

本地數(shù)據(jù)加密:對NSUserDefaults,sqlite存儲文件數(shù)據(jù)加密永部,保護帳號和關鍵信息独泞。
URL編碼加密:對程序中出現(xiàn)的URL進行編碼加密,防止URL被靜態(tài)分析苔埋。
網(wǎng)絡傳輸數(shù)據(jù)加密:對客戶端傳輸數(shù)據(jù)提供加密方案懦砂,有效防止通過網(wǎng)絡接口的攔截獲取數(shù)據(jù)。
方法體组橄,方法名高級混淆:對應用程序的方法名和方法體進行混淆荞膘,保證源碼被逆向后無法解析代碼。
程序結構混排加密:對應用程序邏輯結構進行打亂混排玉工,保證源碼可讀性降到最低羽资。

QA58、Scoket連接和HTTP連接的區(qū)別遵班?

HTTP協(xié)議是基于TCP連接的,是應用層協(xié)議,主要解決如何包裝數(shù)據(jù)补疑。
Socket是對TCP/IP協(xié)議的封裝坯约,Socket本身并不是協(xié)議,而是一個調(diào)用接口(API),通過Socket,我們才能使用TCP/IP協(xié)議。
HTTP連接:短連接糕殉,客戶端向服務器發(fā)送一次請求,服務器響應后連接斷開殖告,節(jié)省資源阿蝶。服務器不能主動給客戶端響應(除非采用HTTP長連接技術)。
Socket連接:長連接黄绩,客戶端跟服務器端直接使用Socket進行連接羡洁,沒有規(guī)定連接后斷開,因此客戶端和服務器段保持連接通道爽丹,雙方可以主動發(fā)送數(shù)據(jù)焚廊。

QA59、Controller如何優(yōu)化?

(答案很多习劫,只要相關都算對)
將網(wǎng)絡請求抽象到單獨的類中咆瘟。
方便在基類中處理公共邏輯。
方便在基類中處理緩存邏輯诽里,以及其它一些公共邏輯袒餐。
方便做對象的持久化。
將界面的封裝抽象到專門的類中谤狡。
構造專門的 UIView 的子類,來負責這些控件的拼裝墓懂。這是最徹底和優(yōu)雅的方 式焰宣,不過稍微麻煩一些的是,你需要把這些控件的事件回調(diào)先接管捕仔,再都一一暴露回 Controller匕积。
構造ViewModel。
借鑒MVVM榜跌。具體做法就是將 ViewController 給 View 傳遞數(shù)據(jù)這個過程闪唆,抽象成構造 ViewModel 的過程。
專門構造存儲類钓葫。
專門來處理本地數(shù)據(jù)的存取悄蕾。
整合常量。

QA60础浮、__weak帆调,__block的作用奠骄?

__weak與weak基本相同。前者用于修飾變量(variable)番刊,后者用于修飾屬性(property)戚揭。__weak 主要用于防止block中的循環(huán)引用。
__block也用于修飾變量撵枢。它是引用修飾,所以其修飾的值是動態(tài)變化的精居,即可以被重新賦值的锄禽。__block用于修飾某些block內(nèi)部將要修改的外部變量。

QA61靴姿、runloop和線程有什么關系?

runloop與線程是一一對應的沃但,一個runloop對應一個核心的線程,為什么說是核心的佛吓,是因為runloop是可以嵌套的宵晚,但是核心的只能有一個,他們的關系保存在一個全局的字典里维雇。
runloop是用來管理線程的淤刃,當線程的runloop被開啟后,線程會在執(zhí)行完任務后進入休眠狀態(tài)吱型,有了任務就會被喚醒去執(zhí)行任務逸贾。

runloop在第一次獲取時被創(chuàng)建,在線程結束時被銷毀津滞。
對于主線程來說铝侵,runloop在程序一啟動就默認創(chuàng)建好了。
對于子線程來說触徐,runloop是懶加載的咪鲜,只有當我們使用的時候才會創(chuàng)建,所以在子線程用定時器要注意:確保子線程的runloop被創(chuàng)建撞鹉,不然定時器不會回調(diào)疟丙。

QA62、id和NSObject*的區(qū)別鸟雏?

id是一個 objc_object 結構體指針隆敢,定義是 typedef struct objc_object *id
id可以理解為指向對象的指針。所有oc的對象id都可以指向崔慧,編譯器不會做類型檢查拂蝎,id調(diào)用任何存在的方法都不會在編譯階段報錯,當然如果這個id指向的對象沒有這個方法惶室,該崩潰還是會崩潰的温自。
NSObject *指向的必須是NSObject的子類玄货,調(diào)用的也只能是NSObjec里面的方法否則就要做強制類型轉換。
不是所有的OC對象都是NSObject的子類悼泌,還有一些繼承自 NSProxy松捉。NSObject *可指向的類型是id的子集。

QA63馆里、setNeedsDisplay 和 layoutIfNeeded 兩者是什么關系隘世?

UIView的setNeedsDisplay和setNeedsLayout兩個方法都是異步執(zhí)行的。
而setNeedsDisplay會自動調(diào)用drawRect方法鸠踪,這樣可以拿到UIGraphicsGetCurrentContext進行繪制丙者;
而setNeedsLayout會默認調(diào)用layoutSubViews,給當前的視圖做了標記营密;layoutIfNeeded 查找是否有標記械媒,如果有標記即立刻刷新。
只有setNeedsLayout和layoutIfNeeded這二者合起來使用评汰,才會起到立刻刷新的效果纷捞。

QA64、iOSApp如何做性能優(yōu)化被去?

(答案很多主儡,只要相關都算對)
一般都是說關于tableView的優(yōu)化處理,造成tableView卡頓的原因:
沒有使用cell的重用標識符惨缆,導致一直創(chuàng)建新的cell缀辩。
cell的重新布局。
沒有提前計算并緩存cell的屬性及內(nèi)容踪央。
cell中控件的數(shù)量過多臀玄。
使用了ClearColor,無背景色畅蹂,透明度為0健无。
更新只使用tableView.reloadData()(如果只是更新某組的話,使用reloadSection進行局部更新)液斜。
加載網(wǎng)絡數(shù)據(jù)累贤,下載圖片,沒有使用異步加載少漆,并緩存臼膏。
使用addView 給cell動態(tài)添加view。
沒有按需加載cell(cell滾動很快時示损,只加載范圍內(nèi)的cell)渗磅。
實現(xiàn)無用的代理方法(tableView只遵守兩個協(xié)議)。
沒有做緩存行高(estimatedHeightForRow不能和HeightForRow里面的layoutIfNeed同時存在,這兩者同時存在才會出現(xiàn)“竄動”的bug始鱼。建議是:只要是固定行高就寫預估行高來減少行高調(diào)用次數(shù)提升性能仔掸。如果是動態(tài)行高就不要寫預估方法了,用一個行高的緩存字典來減少代碼的調(diào)用次數(shù)即可)医清。
做了多余的繪制工作(在實現(xiàn)drawRect:的時候起暮,它的rect參數(shù)就是需要繪制的區(qū)域,這個區(qū)域之外的不需要進行繪制)会烙。
沒有預渲染圖像负懦。(當新的圖像出現(xiàn)時,仍然會有短暫的停頓現(xiàn)象柏腻。解決的辦法就是在bitmap context里先將其畫一遍纸厉,導出成UIImage對象,然后再繪制到屏幕)葫盼。
提升tableView的流暢度:本質(zhì)上是降低 CPU、GPU 的工作村斟,從這兩個大的方面去提升性能贫导。
CPU:對象的創(chuàng)建和銷毀、對象屬性的調(diào)整蟆盹、布局計算孩灯、文本的計算和排版、圖片的格式轉換和解碼逾滥、圖像的繪制
GPU:紋理的渲染
卡頓優(yōu)化在 CPU 層面
盡量用輕量級的對象峰档,比如用不到事件處理的地方,可以考慮使用 CALayer 取代 UIView寨昙。
不要頻繁地調(diào)用 UIView 的相關屬性讥巡,比如 frame、bounds舔哪、transform 等屬性欢顷,盡量減少不必要的修改。
盡量提前計算好布局捉蚤,在有需要時一次性調(diào)整對應的屬性抬驴,不要多次修改屬性。
Autolayout 會比直接設置 frame 消耗更多的 CPU 資源缆巧。
圖片的 size 最好剛好跟 UIImageView 的 size 保持一致布持。
控制一下線程的最大并發(fā)數(shù)量。
盡量把耗時的操作放到子線程陕悬。
文本處理(尺寸計算题暖、繪制)。
圖片處理(解碼、繪制)芙委。
卡頓優(yōu)化在 GPU層面
盡量避免短時間內(nèi)大量圖片的顯示逞敷,盡可能將多張圖片合成一張進行顯示。
GPU能處理的最大紋理尺寸是 4096x4096灌侣,一旦超過這個尺寸推捐,就會占用 CPU 資源進行處理,所以紋理盡量不要超過這個尺寸侧啼。
盡量減少視圖數(shù)量和層次牛柒。
減少透明的視圖(alpha<1),不透明的就設置 opaque 為 YES痊乾。
盡量避免出現(xiàn)離屏渲染皮壁。

QA65、如何設計一種檢測UIViewController的內(nèi)存泄漏的機制哪审?

前提:如果UIViewController被釋放蛾魄,但是持有的子對象還存在,說明這些子對象造成了內(nèi)存泄露湿滓。

設計:子對象subView建立一個對controller的weak引用滴须,如果Controller被釋放,這個weak引用也隨之置為nil叽奥。那怎么知道子對象沒有被釋放呢扔水?可以用一個單例對象每隔一小段時間發(fā)出一個通知給這個子對象,如果子對象還活著就會響應通知朝氓。所以如果子對象subView的controller已不存在魔市,但還能響應到這個通知,那么這個對象就是可疑的泄漏對象赵哲。

QA66待德、類的分類的實現(xiàn)原理?

在運行時過程中枫夺,本類的方法加載完畢之后磅网,會查詢是否有類的分類,如果有類的分類筷屡,就會再去加載類的分類的方法涧偷,把這些方法全部存儲到objc_class結構體的methodLists數(shù)組中。注意毙死,這里的類的分類的方法是插入到數(shù)組的第一個元素位置的燎潮,也就是說類的分類的方法會覆蓋本類的同名方法。如果有多個類的分類都包含同名函數(shù)扼倘,那么最后一個被加載進compile sources的類的分類文件中的方法將會覆蓋其他的同名方法确封。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末除呵,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子爪喘,更是在濱河造成了極大的恐慌颜曾,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秉剑,死亡現(xiàn)場離奇詭異泛豪,居然都是意外死亡,警方通過查閱死者的電腦和手機侦鹏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門诡曙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人略水,你說我怎么就攤上這事价卤。” “怎么了渊涝?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵慎璧,是天一觀的道長。 經(jīng)常有香客問我跨释,道長胸私,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任煤傍,我火速辦了婚禮盖文,結果婚禮上嘱蛋,老公的妹妹穿的比我還像新娘蚯姆。我一直安慰自己,他們只是感情好洒敏,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布龄恋。 她就那樣靜靜地躺著,像睡著了一般凶伙。 火紅的嫁衣襯著肌膚如雪郭毕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天函荣,我揣著相機與錄音显押,去河邊找鬼。 笑死傻挂,一個胖子當著我的面吹牛乘碑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播金拒,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼兽肤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起资铡,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤电禀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后笤休,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尖飞,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年宛官,在試婚紗的時候發(fā)現(xiàn)自己被綠了葫松。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡底洗,死狀恐怖腋么,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情亥揖,我是刑警寧澤珊擂,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站费变,受9級特大地震影響摧扇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜挚歧,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一扛稽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧滑负,春花似錦在张、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至痴鳄,卻和暖如春瘟斜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背痪寻。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工螺句, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人橡类。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓蛇尚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親猫态。 傳聞我的和親對象是個殘疾皇子佣蓉,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359