整理一些面試題舔亭,先記錄下來散罕,有時間再梳理下。
1职抡、__weak
weak用于防止循環(huán)引用误甚;
使用weak關(guān)鍵字時,不會增加對象的引用計數(shù)擅威。當(dāng)對象引用計數(shù)為0時冈钦,所有使用weak修飾的指針將被賦值為nil;
當(dāng)assign指針?biāo)赶虻膬?nèi)存被釋放之后瞧筛,不會自動賦值為nil较幌,這樣再次引用該指針的時候就會導(dǎo)致野指針操作;
weak修飾的指針自動置為nil乍炉?
weak的實現(xiàn)其實是一個哈希表滤馍。表的key是指針指向?qū)ο蟮牡刂返籽瑅alue是指向該對象的weak指針的地址數(shù)組(這里是數(shù)組此叠,可能是多個指針指向同一個對象)随珠;
- 當(dāng)指向?qū)ο蟮闹羔槺粀eak修飾時,對應(yīng)的數(shù)組會增加一個地址窗看。
- 當(dāng)對象被廢棄的時候,找到哈希表中以該對象地址為key的記錄软瞎,將所有weak修飾的指針變量的地址置為nil拉讯;
- 刪除哈希表中的該記錄;
- 從引用計數(shù)表中只锭,刪除廢棄對象地址為key的記錄院尔;
key | value |
---|---|
對象的地址 | 指針地址數(shù)組 |
... | ... |
key:weak指針指向?qū)ο蟮牡刂罚?br> value:指向該對象的所有指針的地址數(shù)組;
2纵顾、使用atomic一定是線程安全的嗎栋盹?
atomic 的屬性只是讀寫安全,屬性的讀寫操作都是串行汉额。但并不是線程安全的躏敢,別的線程還能進行讀寫之外的其他操作。線程安全需要開發(fā)者自己來保證讥脐;
noatomic 的屬性所有線程的讀寫操作都是并行,可能導(dǎo)致無法預(yù)料的結(jié)果俱萍。
atomic 和 nonatomic 的區(qū)別在于告丢,系統(tǒng)自動生成的 getter/setter 方法不一樣。如果你自己寫 getter/setter岳颇,那 atomic/nonatomic/retain/assign/copy 這些關(guān)鍵字只起提示作用颅湘,寫不寫都一樣煞肾。
3、高性能的給UIImageView加個圓角
cornerRadius會導(dǎo)致offscreen drawing有性能問題播赁;
4膘茎、loadView
每次訪問UIViewController的view(比如controller.view脚草、self.view)而且view為nil玩讳,loadView方法就會被調(diào)用。
loadView方法是用來負責(zé)創(chuàng)建UIViewController的view熏纯;
默認實現(xiàn)即[super loadView]里面做了什么事情樟澜。
- 它會先去查找與UIViewController相關(guān)聯(lián)的xib文件,通過加載xib文件來創(chuàng)建UIViewController的view秩贰;
- 如果沒有找到相關(guān)聯(lián)的xib文件毒费,就會創(chuàng)建一個空白的UIView,然后賦值給UIViewController的view屬性想际,大致如下;
5胡本、使用drawRect有什么影響侧甫?(這個可深可淺,你至少得用過咒锻。僻爽。)
內(nèi)存暴增
如果UIView檢測到-drawRect:方法被調(diào)用了贾惦,它就會為試圖分配一個寄宿圖,這個寄宿圖的像素尺寸等于視圖大小乘以contentsScale碰镜。
-drawRect:方法的背后實際上都是底層的CALayer進行了重繪和保存中間產(chǎn)生的圖片绪颖。
一旦你實現(xiàn)了CALayerDelegate協(xié)議中的-drawLayer:inContext:方法或者UIView中的-drawRect:方法(其實就是前者的包裝方法)甜奄,圖層就創(chuàng)建了一個繪制上下文,這個上下文需要的內(nèi)存可從這個公式得出:圖層寬*圖層高*4 字節(jié)牍氛,寬高的單位均為像素烟阐。它就是內(nèi)存問題的關(guān)鍵
drawRect 的調(diào)用
drawRect是在Controller->loadView, Controller->viewDidLoad 兩方法之后掉用的.所以不用擔(dān)心在控制器中,這些View的drawRect就開始畫了.這樣可以在控制器中設(shè)置一些值給View(如果這些View draw的時候需要用到某些變量值).
1.如果UIView 的 frame大小為0蜒茄,將直接導(dǎo)致drawRect不被調(diào)用。
2.該方法在調(diào)用sizeThatFits后被調(diào)用玩祟,所以可以先調(diào)用sizeToFit計算出size屿聋。然后系統(tǒng)自動調(diào)用drawRect:方法庆聘。
3.通過設(shè)置contentMode屬性值為UIViewContentModeRedraw伙判。那么將在每次設(shè)置或更改frame的時候自動調(diào)用drawRect:黑忱。
4.直接調(diào)用setNeedsDisplay甫煞,或者setNeedsDisplayInRect:觸發(fā)drawRect:.
以上1,2推薦;而3,4不提倡
6常潮、UIView和CALayer是啥關(guān)系?
UIView是CALayer的代理楷力,UIView 主要處理時間,CALayer負責(zé)繪制萧朝。
7检柬、http的post和get啥區(qū)別
操作方式 | GET | POST |
---|---|---|
數(shù)據(jù)位置 | HTTP包頭 | HTTP正文 |
明文密文 | 明文 | 可明可密 |
數(shù)據(jù)安全 | 不安全 | 安全 |
長度限制 | 長度較小 | 支持較大數(shù)據(jù)傳輸 |
應(yīng)用場景 | 查詢數(shù)據(jù) | 修改數(shù)據(jù) |
安全性:相對而言何址,POST的安全性要比GET高,因為GET時原押,參數(shù)數(shù)據(jù)是明文傳輸?shù)南钆ィ鳳OST數(shù)據(jù)則可以加密的;
長度限制:GET數(shù)據(jù)是附在URL之后的署隘,而URL則會受到不同環(huán)境的限制的磁餐,比如說IE對其限制為2K+35,而POST可以傳送更多的數(shù)據(jù)(理論上不受限制羞延,也會受瀏覽器伴箩、操作系統(tǒng)鄙漏、服務(wù)器處理能力等限制);
8巩步、多線程
- NSThread
- GCD
- NSOperation & NSOperationQueue
9桦踊、如何自己高效實現(xiàn)NSUserDefault?
NSUserDefaults是定時把緩存中的數(shù)據(jù)寫入磁盤的籍胯,而不是即時寫入竟闪,為了防止在寫完NSUserDefaults后程序退出導(dǎo)致的數(shù)據(jù)丟失,可以在寫入數(shù)據(jù)后使用synchronize強制立即將數(shù)據(jù)寫入磁盤芒炼。如何高效的實現(xiàn)存儲,應(yīng)該是從這個方向著手本刽。
自定義對象在存取時通過NSData做載體子寓;
10斜友、深拷貝淺拷貝
指針拷貝和內(nèi)容拷貝(創(chuàng)建了新對象);
11国拇、什么是method swizzling?
每個類都有一個方法列表酱吝,存放著selector的名字和對應(yīng)方法實現(xiàn)的映射關(guān)系务热。而IMP就是指向方法實現(xiàn)(類似指針)。method swizzling可以做到運行時更換selector指向?qū)?yīng)方法實現(xiàn)的IMP闪湾。比如selectorA指向A實現(xiàn)绩卤,selectorB指向B實現(xiàn)娘纷,更換兩個方法的IMP后赖晶,selectorA調(diào)用的就是B實現(xiàn)了遏插。
12胳嘲、窮舉iOS下所有的本地持久化方案
- plist文件(屬性列表)
- preference(偏好設(shè)置)
- NSKeyedArchiver(歸檔)
- SQLite 3
- CoreData
- 沙盒
沙盒目錄:
“應(yīng)用程序包”
Documents
Library
->Caches
->Preferences
tmp
目錄特性:
"應(yīng)用程序包": 這里面存放的是應(yīng)用程序的源文件了牛,包括資源文件和可執(zhí)行文件鹰祸。
NSString *path = [[NSBundle mainBundle] bundlePath];
Documents: 最常用的目錄蛙婴,iTunes同步該應(yīng)用時會同步此文件夾中的內(nèi)容街图,適合存儲重要數(shù)據(jù)餐济。
NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
Library/Caches: iTunes不會同步此文件夾颤介,適合存儲體積大滚朵,不需要備份的非重要數(shù)據(jù)韵吨。
NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;
Library/Preferences: iTunes同步該應(yīng)用時會同步此文件夾中的內(nèi)容归粉,通常保存應(yīng)用的設(shè)置信息糠悼。
tmp: iTunes不會同步此文件夾倔喂,系統(tǒng)可能在應(yīng)用沒運行時就刪除該目錄下的文件席噩,所以此目錄適合保存應(yīng)用中的一些臨時文件悼枢,用完就刪除馒索。
NSString *path = NSTemporaryDirectory();
13.通過[UIImage imageNamed:]生成的對象什么時候被釋放双揪?
14运吓、用過coredata或者sqlite嗎拘哨?讀寫是分線程的嗎倦青?遇到過死鎖沒?咋解決的踢步?
15获印、設(shè)計個簡單的圖片內(nèi)存緩存器
寫一個FIFO的存儲機制,設(shè)置一定量的內(nèi)存大小鳍征。每次添加新的圖片后檢查是否超出容量艳丛,如果超出則釋放隊列最前面的圖片。
16眶蕉、Binary search tree
時間復(fù)雜度 log(n)
未完待續(xù)...