-
autorelease
嵌套既琴, 系統(tǒng)是怎么處理的荸型?
在`NSAutoReleasePool`中會有一個array保存所有需要被`autorelease`的對象虱疏, 由于我們要確保在保存對象時array不會對該對象進行強引用(retainCount plus 1), 我們需要用CFMutableArrayRef
.
由于每一個線程都有自己的autoReleasePool
, 所以我們需要保存該線程中所創(chuàng)建的所有autoreleasepools乌询,每創(chuàng)建一個autoreleasepool, 我們可以把它放入一個stack里背蟆,然后將這個stack保存起來 這里可以使用:NSMutableDictionary *threadDict = [[NSThread currentThread] threadDictionary]; NSString *key = @"com.my.thread-local.releasepool"; CFMutableArrayRef stack = threadDict[key]; if (!stack) { stack = CFArrayCreateMutable(NULL, 0, NULL); [threadDict setObject:(id)stack forKey:key]; }
當
dealloc
的時候,首先遍歷當前autoReleasePool里所有對象劣砍,發(fā)送release
, 然后release保存所有對象的CFMutableArray (CFRelease(_objects)
). 然后遍歷保存在thread里的stack惧蛹,由于我們將所有在該線程內(nèi)創(chuàng)建的autoreleasepool都存入這個stack里,我們只需要release
所有在self
之后的出現(xiàn)的autoreleasepool, 然后把self
從stack里移除。由于每一個autoreleasepool都遵從這樣的邏輯香嗓,這其實就是一個遞歸的調(diào)用迅腔。 -
ARC 原理
ARC (Automatic Reference Counting), 在對象被創(chuàng)建時,ARC會保存一大堆關(guān)于該對象的信息:對象類型靠娱,所有的屬性等等沧烈,當我們不再需要該對象的時候,ARC會幫助我們銷毀該對象像云。
當我們alloc``init
一個對象實例時锌雀,編譯器會在該實例使用完后插入objc_release
去銷毀該對象。如果我們是在使用properties的時候迅诬,該property的getter會被寫成:- (Test *)test { return objc_retainAutoreleaseReturnValue(_test); }
可以看到汤锨,所有的properties都被retain/autorelease了, 當引用properties時百框,編譯器還會將caller改寫為:
objc_retainAutoreleaseReturnValue([self test])
. 這里出現(xiàn)了兩次的retain/autorelease,而編譯器會優(yōu)化的只使用一次牍汹。 MRC 和 ARC怎么破循環(huán)引用(retain cycle)
使用__weak
或__unsafe_unretained
線程安全
不知道要問什么铐维,問lock?還是其他慎菲?lock的話有:NSLock
,OSSpinLock
,NSRecursiveLock
,pthread_mutex_t
. 我們還可以用serial dispatch_queue_t來作lock嫁蛇。還有dispatch_barrier也可以。至于用哪個露该,就要具體分析了睬棚。NSOperation
可不可以停止
調(diào)用cancel
方法可以將NSOperationQueue
當前狀態(tài)設(shè)為cancelled
,在operation運行中我們要不斷的檢查當前的operationQueue的狀態(tài)解幼,看isCancelled
返回是否為真抑党,若為真,則立刻結(jié)束operation.-
HTTP狀態(tài)碼撵摆,自己寫http框架底靠,緩存,異步特铝,并發(fā)高性能的解決方案
根據(jù)我的經(jīng)驗暑中,用過的HTTP狀態(tài)碼有: 200 OK, 201 Created, 302 Redirect, 304 Not Modified, 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 408 Request Time out, 500 Internal Error, 503 Server Not Available。網(wǎng)上能找到全部的狀態(tài)碼鲫剿,但個人覺得記住一些常用的就足夠了鳄逾,當碰到特殊情況要使用其他狀態(tài)碼,查資料就好了灵莲。對于http框架雕凹,在ios中,通常通過封裝NSURLSession來完成網(wǎng)絡(luò)層的開發(fā),主要注意的是網(wǎng)絡(luò)層應(yīng)獨立请琳,只完成與后臺API的通信粱挡,把數(shù)據(jù)處理或其他與網(wǎng)絡(luò)通信無關(guān)的內(nèi)容分離開來。
緩存俄精,除非有特殊要求询筏,個人建議還是使用NSURLCache
或者NSCache
來完成。如果服務(wù)器支持的話竖慧,應(yīng)該好好利用304狀態(tài)碼的特性嫌套,這樣會節(jié)省流量,而且網(wǎng)絡(luò)響應(yīng)會快些圾旨。
異步這個我覺得不用多說了吧踱讨?NSURLSession
都是異步的。
對于并發(fā)高性能:需要知道的是砍的,NSURLSession
在iOS中最多可以有4個tasks同時運行痹筛,所以應(yīng)該復(fù)用所創(chuàng)建的NSURLSession
, 在它之上創(chuàng)建不同的tasks。如果像是tableview中加載圖片廓鞠,可以創(chuàng)建一個隊列(queue), 如果tasks超過4個帚稠,把超過的放入這個隊列中,當之前的任務(wù)完成時床佳,檢查隊列中有沒有等待的滋早,如果有,把它們從隊列中取出來砌们,然后[task resume]
杆麸。 -
斷點續(xù)傳方案
可使用NSURLSession來完成. 主要通過以下的方法- (void)cancelByProducingResumeData:(void (^)(NSData *resumeData))completionHandler; - (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData;
如果不是使用NSURLSession, 則要麻煩一些,首先必需在暫停時記錄下當前已接收的文件長度浪感,在下一次開始時設(shè)置HTTP header里的
Range
:NSString *range = [NSString stringWithFormat:@"bytes=%lld-", self.receivedLength]; [request setValue:range forHTTPHeaderField:@"Range"];
UI, 動畫優(yōu)化昔头, UITableViewCell優(yōu)化
UI, 動畫優(yōu)化要根據(jù)實際情況以及profiling的結(jié)果來進行具體分析,光這樣問還真不知道該怎么回答影兽。
UITableViewCell的優(yōu)化也是如此减细,但是一般的套路是profiling, 盡量少加subviews, 減少off-screen rendering, 比如圓角圖片,可以在下載圖片時在后臺直接畫圓角在圖片中赢笨。下載圖片時盡量使用caching未蝌。在加載數(shù)據(jù)時,盡量減少數(shù)據(jù)處理的時間茧妒,盡量不要fetching core data 等等萧吠。-
本地數(shù)據(jù)庫海量數(shù)據(jù)如何提高查詢效率和存儲效率
在ios中存儲數(shù)據(jù)基本上就是plist, sqlite 和core data (NSUserDefault其實也是plist), plist建議用在存儲簡單而且數(shù)據(jù)量不大的情況桐筏,而且對于查詢沒有太多要求的纸型。sqlite可以高效的查詢和存儲數(shù)據(jù),但是缺點是:C API, 要自己做封裝,而且每次都需要讀寫硬盤狰腌,對數(shù)據(jù)變化不敏感除破,要手動更新界面從而反應(yīng)數(shù)據(jù)中的變化
在iOS開發(fā)中,除非有特殊需求琼腔,一般都建議使用Core Data.如何提高查詢效率:
- 設(shè)置合適的index.
- 優(yōu)化predicate瑰枫,對于string類型,盡量不要使用
==
- 使用
batchSize
- 合理使用
batchLimit
- 對于需要用到的relationship objects,可以使用
setRelationshipKeyPathsForPrefetching
來減少Faulting overhead. - 可以使用batchFaulting來減少Faulting overhead
如何提高存儲效率:
- 盡量避免在main thread中寫數(shù)據(jù)
- 不要在Core Data中保存圖片丹莲,文件等數(shù)據(jù)
- 對于刪除光坝,更新,盡量batch
- 注意調(diào)用
[NSManagedObjectContext save:]
的時機甥材,盡量是由在后臺運行的NSManagedObjectContext來完成寫入盯另。
-
索引的缺點
- 需要空間儲存索引
- 創(chuàng)建和維護索引需要耗費時間
- 當刪除,插入和更新數(shù)據(jù)是洲赵,索引也需要進行更新鸳惯,這樣降低了寫數(shù)據(jù)的速度。
比較好的面試題(經(jīng)常更新)
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門赫蛇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人雾叭,你說我怎么就攤上這事悟耘。” “怎么了织狐?”我有些...
- 文/不壞的土叔 我叫張陵暂幼,是天一觀的道長。 經(jīng)常有香客問我移迫,道長旺嬉,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任厨埋,我火速辦了婚禮邪媳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己雨效,他們只是感情好迅涮,可當我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著徽龟,像睡著了一般叮姑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上顿肺,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼浸赫!你這毒婦竟也來了闰围?” 一聲冷哼從身側(cè)響起,我...
- 正文 年R本政府宣布尘吗,位于F島的核電站,受9級特大地震影響浇坐,放射性物質(zhì)發(fā)生泄漏摇予。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一吗跋、第九天 我趴在偏房一處隱蔽的房頂上張望侧戴。 院中可真熱鬧宁昭,春花似錦、人聲如沸酗宋。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽蜕猫。三九已至寂曹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間回右,已是汗流浹背隆圆。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
- OC的理解與特性 OC作為一門面向?qū)ο蟮恼Z言虾攻,自然具有面向?qū)ο蟮恼Z言特性:封裝铡买、繼承、多態(tài)台谢。它既具有靜態(tài)語言的特性...