iOS面試筆記常見概念(一)
1.常見提問:
(1)有什麼擅長?
這個要好好想想
(2)技術上研究的最深入的是那一塊?
這個要好好想想,會問的很細.
(3)缺點?優點?為什麼來我公司?面試最後會問對公司有什麼想了解的嗎?
舉例確定然後怎麼改的或者這個缺點不影響工作;
公司發展前景怎麼好等等
公司發展,職位細節,薪資等等
(4)最近看什麼型別的書?經常瀏覽什麼網站?
書:舉例一本技術類和非技術類的
網站: stackoverflow ,github , cocoa China , V2EX , SegmentFault ,CSDN , 簡書 ,部落格園 等等
(5)http 和 https的區別?https怎麼實現更安全的?
>>http有明顯的缺陷,它是明文傳送,同時對訊息完整性檢測不足,這種缺陷很容易被人竊取傳輸中的資訊,尤其是當前網站交易和支付相當普遍,個人越來越重視隱私資訊的情況下。
>>https於就應此而生,網景Netscape公司提出了HTTPS協議,用以增強網上資料傳輸的安全性,作用原理是在TCP和HTTP之間增加了用以保障資料通訊安全性的SSL(Secure Sockets Layer) 協議;基於SSL的HTTP資訊傳輸協議就是HTTPS (HyperText Transfer Protocol over Secure Socket Layer).
>>HTTP採用80資料埠,而HTTPS則443埠。https://zhidao.baidu.com/question/1539092189748973467.html
>> 解釋SSL(Secure Sockets Layer) 協議?
SSL握手協議(SSL Handshake Protocol):它建立在SSL記錄協議之上,用於在實際的資料傳輸開始前,通訊雙方進行身份認證、協商加密演算法、交換加密金鑰等。
SSL協議提供的服務主要有:
1》認證使用者和伺服器,確保資料傳送到正確的客戶機和伺服器;
2》加密資料以防止資料中途被竊取;
3》維護資料的完整性,確保資料在傳輸過程中不被改變。
http://blog.csdn.net/ysdaniel/article/details/6782469
(6)自己手動實現KVO功能?
(7)runtime 中method swizzling 和IMP(VIMP)的區別?
前者是執行時方法交換,直接呼叫方法,後者是以直接呼叫方法的IMP指標,來避免方法呼叫死迴圈的問題,比如:_objc_msgForward是一個函式指標(和 IMP 的型別一樣),是用於訊息轉發的,通過函式指標的形式去呼叫其他或者父類該方法。
http://blog.csdn.net/u014466582/article/details/47108563
(8)自己實現日誌收集和分析(不用第三方比如Bugly)?
http://mobile.51cto.com/hot-436334.htm
http://www.jianshu.com/p/7f584e5c4376
http://blog.sina.com.cn/s/blog_a573f7990102uzt9.html
(9)說說常用加密技術 如MD5 、對稱和RSA非對稱等等技術
* iOS RSA加解密簽名和驗證 程式碼地址https://github.com/HustBroventure/iOSRSAHandler
* iOS,一行程式碼進行RSA、DES 、AES加密、解密及MD5加密
百度知道基本概念:
MD5:http://baike.baidu.com/item/MD5
對稱和非對稱加密概念:http://baike.baidu.com/view/444169.htm
RSA非對稱加密:http://baike.baidu.com/item/RSA演算法
2.RAC:對不同的編碼方式,如: action、delegate、KVO、回撥等。ReactiveCocoa為事件定義了標準的介面,從而可以使用一些基本工具來更容易的連線、過濾和組合。
FRP: 函式響應式程式設計, RAC它是Objective-C語言下FRP思想的一個優秀例項,後續版本也支援了Swift語言。
zip : 訊號合併 combineLatest
3.block:
__weak :block外面修飾防止被強引用
__block :block外面修飾需要在block裡修改的變數
^(){
_strong : block 修飾外面通過__weak修飾過的物件(一般self),防止被提前釋放
}
(2)Block可以定義在方法內部,也可以定義在方法外部;
(3)只有呼叫Block時候,才會執行其{}體內的程式碼
3(1).block:
(A) block(塊)的本質是什麼?
block定義
structBlock_descriptor{
unsignedlongintreserved;unsignedlongintsize;void(*copy)(void*dst,void*src);void(*dispose)(void*);};
structBlock_layout{void*isa;intflags;intreserved;void(*invoke)(void*,...);structBlock_descriptor*descriptor;/* Imported variables. */};
你定義完block之後,其實是建立了一個函式,在建立結構體的時候把函式的指標一起傳給了block,所以之後可以拿出來呼叫。
定義block的時候,變數a的值就傳遞到了block結構體中,僅僅是值傳遞,所以在block中修改a是不會影響到外面的a變數的。
而加了__block字首,並不是直接傳遞a的值了,而是把a的地址傳過去了,所以在block內部便可以修改到外面的變數了。
(B)函式指標? 理解block需要
函式指標是指向函式的指標變數。 因而“函式指標”本身首先應是指標變數,只不過該指標變數指向函式。
(C)指標函式:
指標函式是指返回值是指標的函式,即本質是一個函式。
(D)生成一百個單例物件,如何作記憶體管理?
單例物件地址不都是靜態嗎?所以其實就一個記憶體地址。
Objective-C中的深拷貝和淺拷貝 (推薦)
4.封裝(封裝哪些?)
1.時間選擇器自定義封裝
2.圖片選擇器
3.富文字編輯器
4.圖形柱狀
5.runtime 是 OC底層的一套C語言的API ,
·動態交換兩個方法的實現(特別是交換系統自帶的方法)
·動態新增物件的成員變數和成員方法
·獲得某個類的所有成員方法、所有成員變數
6. KVO 給物件的屬性新增監聽,改變改屬性值,會自動呼叫方法然後進行操作
7.網路處理 :
應用層:HTTP,FTP 等等
傳輸層:TCP,UDP
網路層:IP
TCP/IP 即傳輸控制協議/網間協議,定義了主機如何連入因特網及資料如何再它們之間傳輸的標準
ip地址+協議+埠號唯一標示網路中的一個程式
socket是一種 ”開啟—讀/寫—關閉"模式,[伺服器socket監聽埠-客戶端建立socket-連線伺服器-連線成功-客戶端資料寫入-伺服器讀取-客戶端關閉-伺服器關閉]
8.多執行緒 :
同步 - 非同步 - 併發 - 序列:
·同步和非同步 -函式 -主要影響: 能不能開啟新執行緒
·併發和序列- 佇列 -主要影響: 任務的執行方式
·1.同步併發,同步序列效果相同:只有主執行緒(沒有子執行緒 = 0)
·2.非同步併發:多執行緒同時執行(可能有多個子執行緒 >=1)
·3.非同步序列:主執行緒 和 一個子執行緒(只有一個子執行緒 = 1)
常用:
1.延時dispatch_after
2.once :dispatch_once
3.GCD迭代: dispatch_apply(相對於for迴圈耗時減少一半左右)
4.佇列組 -- 先將分組內的任務完成,再繼續完成別的任務
建立組佇列:dispatch_group_t -> 新增任務到組佇列中執行dispatch_group_async -> 佇列中的任務執行完後,執行這段程式碼: dispatch_group_notify
5.執行子執行緒後回到主執行緒:dispatch_get_main
9.資料儲存:
Realm 是一個跨平臺的移動資料庫引擎
特點:跨平臺,簡單易用,視覺化
Object:模型 -
關係(Relationships):“一對多”“多對一”和“多對多”的關係
寫操作事務:資料庫中的所有操作,比如建立、編輯,或者刪除物件,都必須在事務中完成。“事務”是指位於write閉包內的程式碼段。
查詢(Queries):要在資料庫中檢索資訊
Results:這個類是執行任何查詢請求後所返回的類
10.Swift
1.混編:點選專案-->TARGETS-->Build Settings中找到Swift Compiler,裡面有一項:Objective-C Bridging Header
連結到專案標頭檔案,然後#import "AwesomeMenu.h"就可以了
2.5種修飾符訪問許可權排序: open > public > interal > fileprivate > private
1,private : private訪問級別所修飾的屬性或者方法只能在當前類裡訪問。
2,fileprivate: fileprivate訪問級別所修飾的屬性或者方法在當前的Swift原始檔裡可以訪問。(比如上門樣例把private改成fileprivate就不會報錯了)
3,internal(預設訪問級別,internal修飾符可寫可不寫)
internal訪問級別所修飾的屬性或方法在原始碼所在的整個模組都可以訪問。
如果是框架或者庫程式碼,則在整個框架內部都可以訪問,框架由外部程式碼所引用時,則不可以訪問。
如果是App程式碼,也是在整個App程式碼,也是在整個App內部可以訪問。
4,public : 可以被任何人訪問。但其他module中不可以被override和繼承,而在module內可以被override和繼承。
5,open : 可以被任何人使用,包括override和繼承。
-------------20161027---------------------
面試筆記2:
1.有什麼擅長?
(1)封裝一些常用的小功能Utils
(2)解決一些常見和不常見的bug
(3)快速學習新知識和功能
2.Bug日誌收集 :騰訊bugly , 效能調優 leak 和unused XXX(shift+ common + B)檢視層次:reveal [ri’vi:l]
3.自定義控制元件 : pickview ,圖片選擇器,多選,alertView
常用動畫 :
(1)UIView動畫setAnimation
(2)CATransition(轉場動畫):淡入淡出 , 翻頁
(3)popview
4.SVN、Git程式碼管理命令和工具
Git工具:sourceTree
SVN工具:Cornerstone
5.常用第三方
MJex ,MJref , masonry ,AF , SDweb, BlocksKit , RACetc.
6.
多媒體視訊播:
(1)常用格式:AVPlayer
(2) 視訊播放器
https://github.com/Bilibili/ijkplayer
iOS video player based on FFmpeg n3.1, with MediaCodec, VideoToolbox support.
https://github.com/kolyvan/kxmovie
https://github.com/0xced/XCDYouTubeKit
YouTube video player for iOS, tvOS and OS X
不常用格式視訊:視訊編碼解碼FFmpeg:是一個跨平臺的開源視訊框架,能實現如視訊編碼,解碼,轉碼,串流,播放等豐富的功能。其支援的視訊格式以及播放協議非常豐富,幾乎包含了所有音視訊編解碼、封裝格式以及播放協議
(3)直播流程:
目錄
如何快速的開發一個完整的iOS直播app:
1.七牛雲(熊貓TV,龍珠TV等直播平臺都是用的七牛雲
)
http://cocoadocs.org/docsets/PLCameraStreamingKit/1.7.2/
2.網易視訊雲:基於專業的跨平臺視訊編解碼技術和大規模視訊內容分發網路,提供穩定流暢、低延時、高併發的實時音視訊服務,可將視訊直播無縫對接到自身App
http://vcloud.163.com/docs/index.html
直播
點播
(4)音訊:
豆瓣音訊流:
https://github.com/douban/DOUAudioStreamer
3.多執行緒下載,後臺下載
(1) NSURLSessionDataTask :斷點續傳
(2) NSURLSessionDownloadTask :唯一可以實現後臺下載 和 斷點續傳:
@property (nonatomic, strong) NSData *data;
@property (nonatomic, strong) NSURLSession *session;
@property (nonatomic, strong) NSURLSessionDownloadTask *task;
//下載
_task = [_session downloadTaskWithURL:url];
[_task resume];
//取消下載並呼叫回撥與恢復資料供以後使用
[_task cancelByProducingResumeData:^(NSData *resumeData) {
_data = resumeData;
}];
//恢復下載
_task = [_session downloadTaskWithResumeData:_data];
http://www.cocoachina.com/ios/20160503/16053.html
4.檔案壓縮和解壓縮
第三方框架github網址:https://github.com/ZipArchive/ZipArchive
5.即時通訊
環信 . 融雲 .等第三方
6.開發問題
(1) APP裡接入第三方晚報介面,對方返回資料不穩定導致客戶端資料有問題: 通過自己公司伺服器過濾一遍
(2)稽核問題:對於不能App中包含談論Android系統的內容:不僅僅是名稱,也有圖片包含類似安卓手機的圖片
(3)複雜的角色關係:多個角色對一個頁面功能,很好的鍛鍊了邏輯能力
(4)頻繁的框架改版:前期設計沒有很好的考慮到,後期進行大量改版,工作量多餘
執行緒鎖
@synchronized
面試筆記3:
一常用動畫:
1.左旋轉45°縮小到最小,然後再從小到大推出.
* animation.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 0.50, -0.50, 0.50)];
[animation setSubtype: kCATransitionFromBottom];
kCATransition (Fade淡出MoveIn覆蓋原圖Push推出Reveal底部顯出來..)
2.
[yourView.layer addAnimation:theAnimation forKey:@"animateTransform"];
//中心點
[yourView.layer setAnchorPoint:CGPointMake(0.5, 0.5)];
//左上角
[yourView.layer setAnchorPoint:CGPointMake(0, 0)];
//右下角
[yourView.layer setAnchorPoint:CGPointMake(1, 1)];
2.NSTimer
(1) 舉例:
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:10.0 target:self selector:@selector(timerFired:) userInfo:nil repeats:NO];
或
NSTimer *myTimer = [NSTimertimerWithTimeInterval:3.0 target:selfselector:@selector(timerFired:)userInfo:nilrepeats:NO];
[[NSRunLoopcurrentRunLoop]addTimer:myTimerforMode:NSDefaultRunLoopMode];
//當定時器建立完(不用scheduled的,新增到runloop中後,該定時器將在初始化時指定的timeInterval秒後自動觸發。
(2)、觸發(啟動)
-(void)fire;//方法來立即觸發該定時器;
(3)、停止
- (void)invalidate;//這個是唯一一個可以將計時器從runloop中移出的方法。
3 . runloop使用場景
(1) NSTimer例項是被加到當前runloop中的,模式是NSDefaultRunLoopMode。而“當前runloop”就是應用程式的main runloop,此main runloop負責了所有的主執行緒事件,這其中包括了UI介面的各種事件。當主執行緒中進行復雜的運算,或者進行UI介面操作時,由於在main runloop中NSTimer是同步交付的被“阻塞”,而模式也有可能會改變。因此,就會導致NSTimer計時出現延誤。
使用例項 :
if (self.timer) {
[self.timer invalidate];
self.timer = nil;
}
self.timer = [NSTimer timerWithTimeInterval:0.01 target:self selector:@selector(addTime) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:self.timerforMode:NSRunLoopCommonModes];
解釋:[NSRunLoop currentRunLoop]獲取的就是“main runloop”,使用NSRunLoopCommonModes模式,將NSTimer加入其中。
(2) 開闢子執行緒:使用子執行緒的runloop,使用場景: TableView滾動時中cell同步更新計時器資料)
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(newThread) object:nil];
[thread start];
- (void)newThread{
[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(addTime) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] run];
[預設NSDefaultRunLoopMode,TableView滾動時timer休眠,停止執行]
或者:
NSTimer* timer1 = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(addTimer) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer1 forMode:NSRunLoopCommonModes];
[[NSRunLoop currentRunLoop] run];
}
(3)使用GCD,同樣也是多執行緒方式:
宣告全域性成員變數
1 dispatch_source_t _timers;
實現程式碼:
1uint64_t interval = 0.01 * NSEC_PER_SEC;
2dispatch_queue_t queue = dispatch_queue_create("my queue", 0);
3_timers = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
4dispatch_source_set_timer(_timers, dispatch_time(DISPATCH_TIME_NOW, 0), interval, 0);
5__weak ViewController *blockSelf = self;
6dispatch_source_set_event_handler(_timers, ^()
7{
8NSLog(@"Timer %@", [NSThread currentThread]);
9[blockSelf addTime];
10});
11dispatch_resume(_timers);
然後在主執行緒中修改UI介面:
1 dispatch_async(dispatch_get_main_queue(), ^{
2self.label.text = [NSString stringWithFormat:@"%.2f", self.timeCount/100];
3});
(4)滑動與圖片重新整理
當tableview的cell上有需要從網路獲取的圖片的時候,滾動tableView,非同步執行緒會去載入圖片,載入完成後主執行緒就會設定cell的圖片,但是會造成卡頓。可以讓設定圖片的任務在CFRunLoopDefaultMode下進行,當滾動tableView的時候,RunLoop是在UITrackingRunLoopMode下進行,不去設定圖片,而是當停止的時候,再去設定圖片。
- (void)viewDidLoad {
[superviewDidLoad];
//只在NSDefaultRunLoopMode下執行(重新整理圖片)
[self.myImageView performSelector:@selector(setImage:) withObject:[UIImage imageNamed:@""] afterDelay:ti inModes:@[NSDefaultRunLoopMode]];
}
(5)常駐子執行緒,保持子執行緒一直處理事件
http://blog.csdn.net/pengyuan_d/article/details/50994166
為了保證執行緒長期運轉,可以在子執行緒中加入RunLoop,並且給Runloop設定item,防止Runloop自動退出。
1+ (void)networkRequestThreadEntryPoint:(id)__unused object {
2@autoreleasepool{
3[[NSThread currentThread] setName:@"AFNetworking"];
4NSRunLoop*runLoop = [NSRunLoop currentRunLoop];
5[runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
6[runLoop run];
7}
8}
4.音視訊
(1)封裝格式(MP4,RMVB,TS,FLV,AVI)
編解碼工具:ffmpeg庫—H.264軟編解碼以及常用IPB幀壓縮演算法
(2)音訊:格式:常用新格式AAC (mp3舊):
AAC碼流解析的步驟就是首先從碼流中搜尋0x0FFF,分離出ADTS frame;
然後再分析ADTS frame的首部各個欄位。這就是AAC碼流解碼時的主要邏輯.
(3)視訊畫素資料:
畫素資料主要有兩種,RGB個式和YUV格式
RGB原理:把一幅圖片的每個點上的顏色記錄下來(三原色)
YUV原理:亮度和色度資訊資料,YUV420P格式居多
(4)音訊取樣資料(PCM)
5. FFmpeg相關函式方法庫
(1) FFmpeg的8個庫
.avcodec :編解碼(最重要)
.avformat :封裝格式處理
.avutil :工具庫
.swscale :視訊畫素資料格式轉換
.avfilter :濾鏡特效處理
.avdevice :各種裝置的輸入輸出
.postproc :後加工
.swresample :音訊取樣資料格式轉換
6.FFmpeg解碼流程
FFmpeg所有的初始化都要用到"av_register_all()"這個函式來註冊所有的元件
接下來"avformat_open_input()"是開啟視訊流
"avformat_find_stream_info()"開啟視訊檔案,檢視視訊流資訊(例如這個視訊是多寬多高,解碼器型別)
"avcodec_find_decoder()"找出視訊的解碼器
"avcodec_open2()"將它開啟
接下來進入一個迴圈
"av_read_frame()"呼叫時它會讀取一幀的壓縮資料(h.264碼流)
讀取完後它會執行"Get Packet",若為true則說明讀取到了資料,則進行下一步,若沒讀取到則說明視訊流已經讀取完畢就退出了
"AVPacket"是一個結構體,裡面裝的是h.264
"avcodec_decode_video2()"這是解碼中最重要的函式,他負責將AVPacket->AVFream
"AVFream"裡面裝的是yuv資料
"show on screen"這一步我們後邊會使用SDL將它展示在我們的螢幕上,然後再重新讀取資料,進入迴圈
這就是FFmpeg解碼的一個基本流程
7.block
(1) 引用迴圈
__weak __typeof__(self) weakSelf = self;
dispatch_group_async(_operationsGroup, _operationsQueue, ^
{
__typeof__(self) strongSelf = weakSelf;
[strongSelf doSomething];
[strongSelf doSomethingElse];
} );
8.正規表示式
http://www.admin10000.com/document/5944.html
9.IOS使用Asyncsocket進行socket程式設計:
https://my.oschina.net/u/2448717/blog/499784
10 .oc中結構體和列舉
(1) .推薦的定義列舉型別的方式
typedef NS_ENUM(NSInteger, RWTLeftMenuTopItemType) {
RWTLeftMenuTopItemMain,
RWTLeftMenuTopItemShows,
RWTLeftMenuTopItemSchedule
};
(2) .定義一個Sample結構體
struct Sample{
int a;
int b;
int c;
}sampleStruct;
typedef struct Sample MySampleStruct;
//以後用這個結構體,就可以直接用MySampleStruct去定義了
MySampleStruct samDefineStructVarible = {1,2,1};
samDefineStructVarible.a = 1;
samDefineStructVarible.b =2;
samDefineStructVarible.c = 3;
11 .iOS: webView與html的互動
`pod 'WebViewJavascriptBridge', '~> 5.0'`
12. gcd總結:
為什麼使用gcd:
GCD可用於多核的並行運算
GCD會自動利用更多的CPU核心(比如雙核、四核)
GCD會自動管理執行緒的生命週期(建立執行緒、排程任務、銷燬執行緒)
程式設計師只需要告訴GCD想要執行什麼任務,不需要編寫任何執行緒管理程式碼
同步執行(sync):只能在當前執行緒中執行任務,不具備開啟新執行緒的能力
非同步執行(async):可以在新的執行緒中執行任務,具備開啟新執行緒的能力
併發佇列(Concurrent Dispatch Queue):可以讓多個任務併發(同時)執行(自動開啟多個執行緒同時執行任務)
併發功能只有在非同步(dispatch_async)函式下才有效
序列佇列(Serial Dispatch Queue):讓任務一個接著一個地執行(一個任務執行完畢後,再執行下一個任務)
//序列佇列的建立方法
dispatch_queue_t queue= dispatch_queue_create("test.queue", DISPATCH_QUEUE_SERIAL);
//併發佇列的建立方法
dispatch_queue_t queue= dispatch_queue_create("test.queue", DISPATCH_QUEUE_CONCURRENT);
gcd其他方法:
柵欄方法: dispatch_barrier_async
GCD的佇列組:dispatch_group
//多執行緒
//多執行緒技術:
/*
1:pthread
2:nsthread
3:gcd
4:nsoperation
*/
//gcd相關面試
//序列並行:並行,就是幾個任務一起完成。序列,就是幾個任務一個接著一個完成。
//同步非同步:同步執行執行緒,等待新執行緒執行完以後,再繼續執行當前執行緒,很少用到。非同步執行執行緒,在執行新執行緒的同時,繼續執行當前執行緒,常用。
//gcd使用步驟:
//1:建立執行緒佇列
//2:選擇執行方式
//3;新增執行任務
//4:任務被執行
//建立序列佇列
//serial:序列
dispatch_queue_tserial =dispatch_queue_create("serial",DISPATCH_QUEUE_SERIAL);
//建立並行佇列
//concurrent:並行
dispatch_queue_tconcurrent =dispatch_queue_create("concurrent",DISPATCH_QUEUE_CONCURRENT);
//同步序列
dispatch_sync(serial, ^{
for(inti =0; i <10; i++) {
NSLog(@"同步序列執行一:%d",i);
}
});
dispatch_sync(serial, ^{
for(inti =0; i <10; i++) {
NSLog(@"同步序列執行二:%d",i);
}
});
**********************************************************************
面試筆記4:
1 .runloop
使用場景:
NSTimer , performSelecter , UIEvent ,UIView動畫, Transition動畫
dispatch_get_mian_queue() ,dispatch_background
AF ,
tableView中runloop例項:
(1)延遲載入圖片
uiimage * downloadImage = … ;
[self.imageView performSelector:@selector(setImage:) with object:downloadImage afterDelay:0 inModels:@[NSDefaultRunLoopMode]];
-(void)setImage:(UIImage *)downIamge {
self.imageView.image =downIamge;
}
解釋:設定image操作方法放在runloop的NSDefaultRunLoopMode模式下,當操作UITableView滾動時,設定Image暫時休眠,等待DidEndScroll被喚醒.
同理,如果是耗時操作都是同樣的思路.
(2) NSTimer
runtime
(1)iOS runtime實戰應用:成員變數和屬性
http://www.jianshu.com/p/d361f169423b
(2)[iOS] runtime的使用場景--實戰篇
http://www.jianshu.com/p/07b6c4a40a90
描述一個你遇到過的retain cycle例子。(別撒謊,你肯定遇到過)
答:比如說block裡引用self的屬性
+(void)load; +(void)initialize;有什麼用處?
答:比如說runtime的method swizzling方法調換功能可以寫在load類方法中(一定會呼叫),initialize在該類被使用時才被呼叫.
為什麼其他語言裡叫函式呼叫,objective c裡則是給物件發訊息(或者談下對runtime的理解)
這題考查的是objective c這門語言的dynamic特性,需要對比c++這類傳統靜態方法呼叫才能理解。最好能說出一個物件收到message之後的完整的流程是如何的。對runtime有完整理解的候選人還能說出oc的物件模型。
什麼是method swizzling?
答:動態交換方法。
UIView和CALayer是啥關係?
能答出UIView是CALayer的delegate就及格了,能說出UIView主要處理事件,CALayer負責繪製就更好,再聊下二者在使用過程中對動畫流暢性影響的注意點就superb。UI流暢性是個大話題,推薦看下這兩篇文章。中餐,西餐。
如何高效能的給UIImageView加個圓角?(不準說layer.cornerRadius!)
https://github.com/panghaijiao/HJCornerRadius
這題討論的最多,還有說美工切圖就搞定的。答主在專案裡做過圓角頭像的處理,裡面的坑還真不少。cornerRadius會導致offscreen drawing有效能問題,美工切圖無法適用有背景圖的場景,即使加上shouldRasterize也有cache實效問題。正確的做法是切換到工作執行緒利用CoreGraphic API生成一個offscreen UIImage,再切換到main thread賦值給UIImageView。這裡還涉及到UIImageView複用,圓角頭像cache快取(不能每次都去繪製),新舊頭像替換等等邏輯。還有其他的實現方式,但思路離不開工作執行緒與主執行緒切換。
使用drawRect有什麼影響?(這個可深可淺,你至少得用過。。)
不少同學都用過drawRect或者看別人用過,但不知道這個api存在的含義。這不僅僅是另一種做UI的方式。drawRect會利用CPU生成offscreen bitmap,從而減輕GPU的繪製壓力,用這種方式最UI可以將動畫流暢性優化到極致,但缺點是繪製api複雜,offscreen cache增加記憶體開銷。UI動畫流暢性的優化主要平衡CPU和GPU的工作壓力。推薦一篇文章:西餐
ASIHttpRequest或者SDWebImage裡面給UIImageView載入圖片的邏輯是什麼樣的?(把UIImageView放到UITableViewCell裡面問更贊)
很多同學沒有讀原始碼的習慣,別人的輪子拿來只是用用卻不知道真正的營養都在原始碼裡面。這兩個經典的framework程式碼並不複雜,很值得一讀。能對一個UIImageView怎麼通過url展示一張圖片有完整的理解。涉及到的知識點也非常多,UITableViewCell的複用,memory cache, disk cache,多執行緒切換,甚至http協議本身都需要有一定的涉及。
麻煩你設計個簡單的圖片記憶體快取器(移除策略是一定要說的)
記憶體快取是個通用話題,每個平臺都會涉及到。cache演算法會影響到整個app的表現。候選人最好能談下自己都瞭解哪些cache策略及各自的特點。常見的有FIFO,LRU,LRU-2,2Q等等。由於NSCache的快取策略不透明,一些app開發者會選擇自己做一套cache機制,其實並不難。
講講你用Instrument優化動畫效能的經歷吧(別問我什麼是Instrument)
Apple的instrument為開發者提供了各種template去優化app效能和定位問題。很多公司都在趕feature,並沒有充足的時間來做優化,導致不少開發者對instrument不怎麼熟悉。但這裡面其實涵蓋了非常完整的計算機基礎理論知識體系,memory,disk,network,thread,cpu,gpu等等,順藤摸瓜去學習,是一筆巨大的知識財富。動畫效能只是其中一個template,重點還是理解上面問題當中CPU GPU如何配合工作的知識。
loadView是幹嘛用的?
不要就簡單的告訴我沒用過,至少問下我有什麼用。。這裡是apple給開發者自己設定custom view的位置。說UI熟悉的一定要知道。
viewWillLayoutSubView你總是知道的。。
controller layout觸發的時候,開發者有機會去重新layout自己的各個subview。說UI熟悉的一定要知道。
GCD裡面有哪幾種Queue?你自己建立過序列queue嗎?背後的執行緒模型是什麼樣的?
兩種queue,序列和並行。main queue是序列,global queue是並行。有些開發者為了在工作執行緒序列的處理任務會自己建立一個serial queue。背後是蘋果維護的執行緒池,各種queue要用執行緒都是這個池子裡取的。GCD大家都用過,但很多關鍵的概念不少人都理解的模凌兩可。序列,並行,同步,非同步是GCD的核心概念。
用過coredata或者sqlite嗎?讀寫是分執行緒的嗎?遇到過死鎖沒?咋解決的?
沒用過sqlite是說不過去的。用過CoreData的肯定有很多血淚史要說。多謝執行緒模型你肯定做過比較選擇。死鎖是啥肯定也是要知道的,沒遇到過至少能舉個簡單的例子來說明。單個執行緒可以死鎖(main thread裡dispatch_sync到main queue),多個執行緒直接也可以死鎖(A,B執行緒互相持有對方需要的資源且互相等待)。
http的post和get啥區別?(區別挺多的,麻煩多說點)
這個可以說很多。不希望聽到的答案有
兩個差不多,隨便用一個。
post比get安全(其實兩個都不安全)
能說下兩個http格式有什麼不同,各自應用的場景就合格了。更多可以閱讀下這個答案。
我知道你大學畢業過後就沒接觸過演算法資料結構了,但是請你一定告訴我什麼是Binary search tree? search的時間複雜度是多少?我很想知道!
很多人都很排斥資料結構和演算法題,我個人意見是複雜的可以不知道,基礎的一定要了解。時間複雜度是什麼得知道,list,queue,stack,table,tree這些都要明白是啥。連hash表的概念都不知道怎麼能保證在寫程式碼的時候注意效能呢。
如何自己高效實現NSUserDefault?
NSUserDefaults *mySettingData = [NSUserDefaults standardUserDefaults];
建立NSUserDefaults物件之後即可往裡面新增資料,它支援的資料型別有NSString、NSNumber、NSDate、NSArray、NSDictionary、BOOL、NSInteger、NSFloat等系統定義的資料型別,如果要存放自定義的物件(如自定義的類物件),則必須將其轉換成NSData儲存:
NSArray *arr = [[NSArray alloc] initWithObjects:@"arr1", @"arr2", nil]
[mySettingData setObject:arr forKey:@"arrItem"];
[mySettingData setObject:@"admin" forKey:@"user_name"];
[mySettingData setBOOL:@YES forKey:@"auto_login"];
[mySettingData setInteger:1 forKey:@"count"];
[mySettingData synchronize];//同步到plist檔案中
如何用HTTP實現長連線?
如果瀏覽器或者伺服器在其頭資訊加入了這行程式碼
Connection:keep-alive
談下Objective C都有哪些鎖機制,你一般用哪個?
http://blog.csdn.net/roger_jin/article/details/45307951
常用:@synchronized程式碼塊
如何終止正在執行的工作執行緒?
NSthread 有 cancel方法
NSOperation:佇列的取消,暫停和恢復
(1)取消佇列的所有操作
- (void)cancelAllOperations;
提⽰:也可以呼叫NSOperation的- (void)cancel⽅法取消單個操作
(2)暫停和恢復佇列
- (void)setSuspended:(BOOL)b; // YES代表暫停佇列,NO代表恢復佇列
- (BOOL)isSuspended; //當前狀態
(3)暫停和恢復的適用場合:在tableview介面,開執行緒下載遠端的網路介面,對UI會有影響,使使用者體驗變差。那麼這種情況,就可以設定在使用者操作UI(如滾動螢幕)的時候,暫停佇列(不是取消佇列),停止滾動的時候,恢復佇列。
列舉iOS下的幾種本地持久化方案
plist檔案(屬性列表)
preference(偏好設定)
NSKeyedArchiver(歸檔)
SQLite 3
CoreData
Realm
相關文章
- iOS常見面試題總結iOS面試題
- mybatis常見面試/筆試題MyBatis面試筆試
- Oracle面試、筆試常見題Oracle面試筆試
- 技術崗-常見筆試面試題筆試面試題
- MySQL常見索引概念MySql索引
- css常見的概念CSS
- iOS 避免常見崩潰(一)iOS
- 前端面試常問的一些筆記前端面試筆記
- 嵌入式產品常見記憶體概念記憶體
- iOS常見基礎面試題(附參考答案)iOS面試題
- JDBC常見面試題集錦(一)JDBC面試題
- 筆記本常見故障與排除方法筆記
- 漫畫 | Redis常見面試問題(一)Redis面試
- 【Java面試】 Javascript常見面試題!JavaScript面試題
- 【Java面試】Servlet常見面試題!JavaServlet面試題
- 【面試】面試常見問題整理面試
- ajax常見面試題面試題
- 前端常見面試題前端面試題
- 常見 React 面試題React面試題
- Redis常見面試題Redis面試題
- Golang常見面試題Golang面試題
- Mysql 常見面試題MySql面試題
- Redis 常見面試題Redis面試題
- Dubbo常見面試題面試題
- JDBC常見面試題JDBC面試題
- mybatis常見面試題MyBatis面試題
- SQL常見面試題SQL面試題
- 常見Java面試題Java面試題
- Docker常見面試題Docker面試題
- vue 常見面試題Vue面試題
- axios的一些常見用法iOS
- iOS 常見知識點(一):RuntimeiOS
- Javascript常見排序演算法的筆記JavaScript排序演算法筆記
- 【Java面試】Java常見IO面試題!Java面試題
- 【Java面試】JSP常見面試題!JavaJS面試題
- 【面試篇】Go語言常見踩坑(一)面試Go
- 牛客堂常見面試題精講(一)1面試題
- 求職面試常見問題:Python常見面試題全解析附答案求職Python面試題