iOS面試筆記常見概念(一)

1.常見提問:

(1)有什么擅長?

這個要好好想想

(2)技術(shù)上研究的最深入的是那一塊?

這個要好好想想,會問的很細(xì).

(3)缺點?優(yōu)點?為什么來我公司?面試最后會問對公司有什么想了解的嗎?

舉例確定然后怎么改的或者這個缺點不影響工作;

公司發(fā)展前景怎么好等等

公司發(fā)展,職位細(xì)節(jié),薪資等等

(4)最近看什么類型的書?經(jīng)常瀏覽什么網(wǎng)站?

書:舉例一本技術(shù)類和非技術(shù)類的

網(wǎng)站: stackoverflow ,github , cocoa China , V2EX , SegmentFault ,CSDN , 簡書 ,博客園 等等

(5)http 和 https的區(qū)別?https怎么實現(xiàn)更安全的?

>>http有明顯的缺陷球化,它是明文傳送,同時對消息完整性檢測不足乾闰,這種缺陷很容易被人竊取傳輸中的信息裂问,尤其是當(dāng)前網(wǎng)站交易和支付相當(dāng)普遍浅悉,個人越來越重視隱私信息的情況下屹蚊。

>>https于就應(yīng)此而生讹开,網(wǎng)景Netscape公司提出了HTTPS協(xié)議咐熙,用以增強網(wǎng)上數(shù)據(jù)傳輸?shù)陌踩?作用原理是在TCP和HTTP之間增加了用以保障數(shù)據(jù)通信安全性的SSL(Secure Sockets Layer) 協(xié)議;基于SSL的HTTP信息傳輸協(xié)議就是HTTPS (HyperText Transfer Protocol over Secure Socket Layer).

>>HTTP采用80數(shù)據(jù)端口,而HTTPS則443端口杀赢。https://zhidao.baidu.com/question/1539092189748973467.html

>> 解釋SSL(Secure Sockets Layer) 協(xié)議烘跺?

SSL握手協(xié)議(SSL Handshake Protocol):它建立在SSL記錄協(xié)議之上,用于在實際的數(shù)據(jù)傳輸開始前脂崔,通訊雙方進行身份認(rèn)證液荸、協(xié)商加密算法、交換加密密鑰等脱篙。

SSL協(xié)議提供的服務(wù)主要有:

1》認(rèn)證用戶和服務(wù)器,確保數(shù)據(jù)發(fā)送到正確的客戶機和服務(wù)器伤柄;

2》加密數(shù)據(jù)以防止數(shù)據(jù)中途被竊劝砝А;

3》維護數(shù)據(jù)的完整性适刀,確保數(shù)據(jù)在傳輸過程中不被改變秤朗。

http://blog.csdn.net/ysdaniel/article/details/6782469

(6)自己手動實現(xiàn)KVO功能?


(7)runtime 中method swizzling 和IMP(VIMP)的區(qū)別?

前者是運行時方法交換笔喉,直接調(diào)用方法取视,后者是以直接調(diào)用方法的IMP指針,來避免方法調(diào)用死循環(huán)的問題常挚,比如:_objc_msgForward是一個函數(shù)指針(和 IMP 的類型一樣)作谭,是用于消息轉(zhuǎn)發(fā)的,通過函數(shù)指針的形式去調(diào)用其他或者父類該方法奄毡。

http://blog.csdn.net/u014466582/article/details/47108563

(8)自己實現(xiàn)日志收集和分析(不用第三方比如Bugly)折欠?

http://mobile.51cto.com/hot-436334.htm

http://www.reibang.com/p/7f584e5c4376

http://blog.sina.com.cn/s/blog_a573f7990102uzt9.html

(9)說說常用加密技術(shù) 如MD5 、對稱和RSA非對稱等等技術(shù)

* 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扇谣、回調(diào)等昧捷。ReactiveCocoa為事件定義了標(biāo)準(zhǔn)的接口,從而可以使用一些基本工具來更容易的連接揍堕、過濾和組合料身。

FRP: 函數(shù)響應(yīng)式編程, RAC它是Objective-C語言下FRP思想的一個優(yōu)秀實例,后續(xù)版本也支持了Swift語言衩茸。

zip : 信號合并? combineLatest

3.block:

__weak? :block外面修飾防止被強引用

__block :block外面修飾需要在block里修改的變量

^(){

_strong : block 修飾外面通過__weak修飾過的對象(一般self),防止被提前釋放

}

(2)Block可以定義在方法內(nèi)部芹血,也可以定義在方法外部;

(3)只有調(diào)用Block時候楞慈,才會執(zhí)行其{}體內(nèi)的代碼

3(1).block:

(A) block(塊)的本質(zhì)是什么幔烛?

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之后,其實是創(chuàng)建了一個函數(shù)囊蓝,在創(chuàng)建結(jié)構(gòu)體的時候把函數(shù)的指針一起傳給了block饿悬,所以之后可以拿出來調(diào)用。

定義block的時候聚霜,變量a的值就傳遞到了block結(jié)構(gòu)體中狡恬,僅僅是值傳遞,所以在block中修改a是不會影響到外面的a變量的蝎宇。

而加了__block前綴,并不是直接傳遞a的值了弟劲,而是把a的地址傳過去了,所以在block內(nèi)部便可以修改到外面的變量了姥芥。

(B)函數(shù)指針? 理解block需要

函數(shù)指針是指向函數(shù)的指針變量兔乞。 因而“函數(shù)指針”本身首先應(yīng)是指針變量,只不過該指針變量指向函數(shù)凉唐。

(C)指針函數(shù):

指針函數(shù)是指返回值是指針的函數(shù)庸追,即本質(zhì)是一個函數(shù)。

(D)生成一百個單例對象台囱,如何作內(nèi)存管理淡溯?

單例對象地址不都是靜態(tài)嗎?所以其實就一個內(nèi)存地址簿训。

IOS中復(fù)制對象的用法及深拷貝和淺拷貝詳解

Objective-C中的深拷貝和淺拷貝 (推薦)

4.封裝(封裝哪些?)

1.時間選擇器自定義封裝

2.圖片選擇器

3.富文本編輯器

4.圖形柱狀

5.runtime 是 OC底層的一套C語言的API ,

·動態(tài)交換兩個方法的實現(xiàn)(特別是交換系統(tǒng)自帶的方法)

·動態(tài)添加對象的成員變量和成員方法

·獲得某個類的所有成員方法血筑、所有成員變量

6. KVO 給對象的屬性添加監(jiān)聽,改變改屬性值,會自動調(diào)用方法然后進行操作


7.網(wǎng)絡(luò)處理 :

應(yīng)用層:HTTP绘沉,F(xiàn)TP 等等

傳輸層:TCP,UDP

網(wǎng)絡(luò)層:IP

TCP/IP 即傳輸控制協(xié)議/網(wǎng)間協(xié)議豺总,定義了主機如何連入因特網(wǎng)及數(shù)據(jù)如何再它們之間傳輸?shù)臉?biāo)準(zhǔn)

ip地址+協(xié)議+端口號唯一標(biāo)示網(wǎng)絡(luò)中的一個進程

socket是一種 ”打開—讀/寫—關(guān)閉"模式,[服務(wù)器socket監(jiān)聽端口-客戶端創(chuàng)建socket-連接服務(wù)器-連接成功-客戶端數(shù)據(jù)寫入-服務(wù)器讀取-客戶端關(guān)閉-服務(wù)器關(guān)閉]


8.多線程 :

同步 - 異步 - 并發(fā) - 串行:

·同步和異步 -函數(shù) -主要影響: 能不能開啟新線程

·并發(fā)和串行- 隊列 -主要影響: 任務(wù)的執(zhí)行方式

·1.同步并發(fā),同步串行效果相同:只有主線程(沒有子線程 = 0)

·2.異步并發(fā):多線程同時執(zhí)行(可能有多個子線程 >=1)

·3.異步串行:主線程 和 一個子線程(只有一個子線程 = 1)


常用:

1.延時dispatch_after

2.once :dispatch_once

3.GCD迭代: dispatch_apply(相對于for循環(huán)耗時減少一半左右)

4.隊列組 -- 先將分組內(nèi)的任務(wù)完成车伞,再繼續(xù)完成別的任務(wù)

創(chuàng)建組隊列:dispatch_group_t? -> 添加任務(wù)到組隊列中執(zhí)行dispatch_group_async ->? 隊列中的任務(wù)執(zhí)行完后,執(zhí)行這段代碼: dispatch_group_notify

5.執(zhí)行子線程后回到主線程:dispatch_get_main


9.數(shù)據(jù)存儲:

Realm 是一個跨平臺的移動數(shù)據(jù)庫引擎

特點:跨平臺,簡單易用,可視化

Object:模型 -

關(guān)系(Relationships):“一對多”“多對一”和“多對多”的關(guān)系

寫操作事務(wù):數(shù)據(jù)庫中的所有操作喻喳,比如創(chuàng)建另玖、編輯,或者刪除對象表伦,都必須在事務(wù)中完成谦去。“事務(wù)”是指位于write閉包內(nèi)的代碼段蹦哼。

查詢(Queries):要在數(shù)據(jù)庫中檢索信息

Results:這個類是執(zhí)行任何查詢請求后所返回的類


10.Swift

? 1.混編:點擊項目-->TARGETS-->Build Settings中找到Swift Compiler鳄哭,里面有一項:Objective-C Bridging Header

鏈接到項目頭文件,然后#import "AwesomeMenu.h"就可以了

? 2.5種修飾符訪問權(quán)限排序:? open > public > interal > fileprivate > private

1,private : private訪問級別所修飾的屬性或者方法只能在當(dāng)前類里訪問纲熏。

2妆丘,fileprivate: fileprivate訪問級別所修飾的屬性或者方法在當(dāng)前的Swift源文件里可以訪問。(比如上門樣例把private改成fileprivate就不會報錯了)

3局劲,internal(默認(rèn)訪問級別勺拣,internal修飾符可寫可不寫)

internal訪問級別所修飾的屬性或方法在源代碼所在的整個模塊都可以訪問。

如果是框架或者庫代碼鱼填,則在整個框架內(nèi)部都可以訪問药有,框架由外部代碼所引用時,則不可以訪問苹丸。

如果是App代碼愤惰,也是在整個App代碼,也是在整個App內(nèi)部可以訪問赘理。

4宦言,public :? 可以被任何人訪問。但其他module中不可以被override和繼承感憾,而在module內(nèi)可以被override和繼承。

5令花,open? : 可以被任何人使用阻桅,包括override和繼承。

-------------20161027---------------------

面試筆記2:

1.有什么擅長?

(1)封裝一些常用的小功能Utils

(2)解決一些常見和不常見的bug

(3)快速學(xué)習(xí)新知識和功能

2.Bug日志收集 :騰訊bugly , 性能調(diào)優(yōu) leak 和unused XXX(shift+ common + B)視圖層次:reveal [ri’vi:l]

3.自定義控件 : pickview ,圖片選擇器,多選,alertView

常用動畫 :

(1)UIView動畫setAnimation

(2)CATransition(轉(zhuǎn)場動畫):淡入淡出 , 翻頁

(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:是一個跨平臺的開源視頻框架,能實現(xiàn)如視頻編碼,解碼,轉(zhuǎn)碼,串流,播放等豐富的功能嫂沉。其支持的視頻格式以及播放協(xié)議非常豐富,幾乎包含了所有音視頻編解碼、封裝格式以及播放協(xié)議

(3)直播流程:

目錄

【如何快速的開發(fā)一個完整的iOS直播app】(原理篇)

【如何快速的開發(fā)一個完整的iOS直播app】(播放篇)

【如何快速的開發(fā)一個完整的iOS直播app】(采集篇)

【如何快速的開發(fā)一個完整的iOS直播app】(美顏篇)

如何快速的開發(fā)一個完整的iOS直播app:

1.七牛云(熊貓TV,龍珠TV等直播平臺都是用的七牛云

)

http://cocoadocs.org/docsets/PLCameraStreamingKit/1.7.2/

2.網(wǎng)易視頻云:基于專業(yè)的跨平臺視頻編解碼技術(shù)和大規(guī)模視頻內(nèi)容分發(fā)網(wǎng)絡(luò)扮碧,提供穩(wěn)定流暢趟章、低延時杏糙、高并發(fā)的實時音視頻服務(wù),可將視頻直播無縫對接到自身App

http://vcloud.163.com/docs/index.html

直播

產(chǎn)品介紹

服務(wù)端API文檔

推流端SDK

播放器SDK

DEMO使用指南

點播

產(chǎn)品介紹

服務(wù)端API文檔

上傳SDK

播放器SDK

DEMO使用指南

(4)音頻:

豆瓣音頻流:

https://github.com/douban/DOUAudioStreamer

3.多線程下載蚓土,后臺下載

(1) NSURLSessionDataTask :斷點續(xù)傳

(2) NSURLSessionDownloadTask :唯一可以實現(xiàn)后臺下載 和 斷點續(xù)傳:

@property (nonatomic, strong) NSData *data;

@property (nonatomic, strong) NSURLSession *session;

@property (nonatomic, strong) NSURLSessionDownloadTask *task;

//下載

_task = [_session downloadTaskWithURL:url];

[_task resume];

//取消下載并調(diào)用回調(diào)與恢復(fù)數(shù)據(jù)供以后使用

[_task cancelByProducingResumeData:^(NSData *resumeData) {

_data = resumeData;

}];

//恢復(fù)下載

_task = [_session downloadTaskWithResumeData:_data];

http://www.cocoachina.com/ios/20160503/16053.html

4.文件壓縮和解壓縮

第三方框架github網(wǎng)址:https://github.com/ZipArchive/ZipArchive

5.即時通訊

環(huán)信 . 融云 .等第三方

6.開發(fā)問題

(1) APP里接入第三方晚報接口,對方返回數(shù)據(jù)不穩(wěn)定導(dǎo)致客戶端數(shù)據(jù)有問題: 通過自己公司服務(wù)器過濾一遍

(2)審核問題:對于不能App中包含談?wù)揂ndroid系統(tǒng)的內(nèi)容:不僅僅是名稱,也有圖片包含類似安卓手機的圖片

(3)復(fù)雜的角色關(guān)系:多個角色對一個頁面功能,很好的鍛煉了邏輯能力

(4)頻繁的框架改版:前期設(shè)計沒有很好的考慮到,后期進行大量改版,工作量多余

線程鎖

@synchronized

面試筆記3:

一常用動畫:

1.左旋轉(zhuǎn)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];

//當(dāng)定時器創(chuàng)建完(不用scheduled的宏侍,添加到runloop中后,該定時器將在初始化時指定的timeInterval秒后自動觸發(fā)蜀漆。

(2)谅河、觸發(fā)(啟動)

-(void)fire;//方法來立即觸發(fā)該定時器;

(3)确丢、停止

- (void)invalidate;//這個是唯一一個可以將計時器從runloop中移出的方法绷耍。

3 . runloop使用場景

(1) NSTimer實例是被加到當(dāng)前runloop中的,模式是NSDefaultRunLoopMode鲜侥。而“當(dāng)前runloop”就是應(yīng)用程序的main runloop褂始,此main runloop負(fù)責(zé)了所有的主線程事件,這其中包括了UI界面的各種事件描函。當(dāng)主線程中進行復(fù)雜的運算崎苗,或者進行UI界面操作時,由于在main runloop中NSTimer是同步交付的被“阻塞”赘阀,而模式也有可能會改變益缠。因此,就會導(dǎo)致NSTimer計時出現(xiàn)延誤基公。

使用實例 :

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同步更新計時器數(shù)據(jù))

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];

[默認(rèn)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;

實現(xiàn)代碼:

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)滑動與圖片刷新

當(dāng)tableview的cell上有需要從網(wǎng)絡(luò)獲取的圖片的時候,滾動tableView酸休,異步線程會去加載圖片骂租,加載完成后主線程就會設(shè)置cell的圖片,但是會造成卡頓斑司∩可以讓設(shè)置圖片的任務(wù)在CFRunLoopDefaultMode下進行,當(dāng)滾動tableView的時候宿刮,RunLoop是在UITrackingRunLoopMode下進行互站,不去設(shè)置圖片,而是當(dāng)停止的時候僵缺,再去設(shè)置圖片胡桃。

- (void)viewDidLoad {

[superviewDidLoad];

//只在NSDefaultRunLoopMode下執(zhí)行(刷新圖片)

[self.myImageView performSelector:@selector(setImage:) withObject:[UIImage imageNamed:@""] afterDelay:ti inModes:@[NSDefaultRunLoopMode]];

}

(5)常駐子線程,保持子線程一直處理事件

http://blog.csdn.net/pengyuan_d/article/details/50994166

為了保證線程長期運轉(zhuǎn)磕潮,可以在子線程中加入RunLoop翠胰,并且給Runloop設(shè)置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斤富,TSFLV闺兢,AVI)

編解碼工具:ffmpeg庫—H.264軟編解碼以及常用IPB幀壓縮算法

(2)音頻:格式:常用新格式AAC (mp3舊):

AAC碼流解析的步驟就是首先從碼流中搜索0x0FFF茂缚,分離出ADTS frame;

然后再分析ADTS frame的首部各個字段屋谭。這就是AAC碼流解碼時的主要邏輯.

(3)視頻像素數(shù)據(jù):

像素數(shù)據(jù)主要有兩種,RGB個式和YUV格式

RGB原理:把一幅圖片的每個點上的顏色記錄下來(三原色)

YUV原理:亮度和色度信息數(shù)據(jù),YUV420P格式居多

(4)音頻采樣數(shù)據(jù)(PCM)

5. FFmpeg相關(guān)函數(shù)方法庫

(1) FFmpeg8個庫

.avcodec :編解碼(最重要)

.avformat :封裝格式處理

.avutil :工具庫

.swscale :視頻像素數(shù)據(jù)格式轉(zhuǎn)換

.avfilter :濾鏡特效處理

.avdevice :各種設(shè)備的輸入輸出

.postproc :后加工

.swresample :音頻采樣數(shù)據(jù)格式轉(zhuǎn)換

6.FFmpeg解碼流程

FFmpeg所有的初始化都要用到"av_register_all()"這個函數(shù)來注冊所有的組件

接下來"avformat_open_input()"是打開視頻流

"avformat_find_stream_info()"打開視頻文件,查看視頻流信息(例如這個視頻是多寬多高,解碼器類型)

"avcodec_find_decoder()"找出視頻的解碼器

"avcodec_open2()"將它打開

接下來進入一個循環(huán)

"av_read_frame()"調(diào)用時它會讀取一幀的壓縮數(shù)據(jù)(h.264碼流)

讀取完后它會執(zhí)行"Get Packet",若為true則說明讀取到了數(shù)據(jù),則進行下一步,若沒讀取到則說明視頻流已經(jīng)讀取完畢就退出了

"AVPacket"是一個結(jié)構(gòu)體,里面裝的是h.264

"avcodec_decode_video2()"這是解碼中最重要的函數(shù),他負(fù)責(zé)將AVPacket->AVFream

"AVFream"里面裝的是yuv數(shù)據(jù)

"show on screen"這一步我們后邊會使用SDL將它展示在我們的屏幕上,然后再重新讀取數(shù)據(jù),進入循環(huán)

這就是FFmpeg解碼的一個基本流程

7.block

(1) 引用循環(huán)

__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中結(jié)構(gòu)體枚舉

(1) .推薦的定義枚舉類型的方式

typedef NS_ENUM(NSInteger, RWTLeftMenuTopItemType) {

RWTLeftMenuTopItemMain,

RWTLeftMenuTopItemShows,

RWTLeftMenuTopItemSchedule

};

(2) .定義一個Sample結(jié)構(gòu)體

struct Sample{

int a;

int b;

int c;

}sampleStruct;

typedef struct Sample MySampleStruct;

//以后用這個結(jié)構(gòu)體脚囊,就可以直接用MySampleStruct去定義了

MySampleStruct samDefineStructVarible = {1,2,1};

samDefineStructVarible.a = 1;

samDefineStructVarible.b =2;

samDefineStructVarible.c = 3;

11 .iOS: webViewhtml的交互

`pod 'WebViewJavascriptBridge', '~> 5.0'`

12. gcd總結(jié):

為什么使用gcd:

GCD可用于多核的并行運算

GCD會自動利用更多的CPU內(nèi)核(比如雙核、四核)

GCD會自動管理線程的生命周期(創(chuàng)建線程桐磁、調(diào)度任務(wù)悔耘、銷毀線程)

程序員只需要告訴GCD想要執(zhí)行什么任務(wù),不需要編寫任何線程管理代碼

同步執(zhí)行(sync):只能在當(dāng)前線程中執(zhí)行任務(wù)我擂,不具備開啟新線程的能力

異步執(zhí)行(async):可以在新的線程中執(zhí)行任務(wù)衬以,具備開啟新線程的能力

并發(fā)隊列(Concurrent Dispatch Queue):可以讓多個任務(wù)并發(fā)(同時)執(zhí)行(自動開啟多個線程同時執(zhí)行任務(wù))

并發(fā)功能只有在異步(dispatch_async)函數(shù)下才有效

串行隊列(Serial Dispatch Queue):讓任務(wù)一個接著一個地執(zhí)行(一個任務(wù)執(zhí)行完畢后,再執(zhí)行下一個任務(wù))

//串行隊列的創(chuàng)建方法

dispatch_queue_t queue= dispatch_queue_create("test.queue", DISPATCH_QUEUE_SERIAL);

//并發(fā)隊列的創(chuàng)建方法

dispatch_queue_t queue= dispatch_queue_create("test.queue", DISPATCH_QUEUE_CONCURRENT);

gcd其他方法:

柵欄方法: dispatch_barrier_async

GCD的隊列組:dispatch_group

//多線程

//多線程技術(shù):

/*

1:pthread

2:nsthread

3:gcd

4:nsoperation

*/

//gcd相關(guān)面試

//串行并行:并行校摩,就是幾個任務(wù)一起完成看峻。串行,就是幾個任務(wù)一個接著一個完成衙吩。

//同步異步:同步執(zhí)行線程互妓,等待新線程執(zhí)行完以后,再繼續(xù)執(zhí)行當(dāng)前線程坤塞,很少用到冯勉。異步執(zhí)行線程,在執(zhí)行新線程的同時摹芙,繼續(xù)執(zhí)行當(dāng)前線程灼狰,常用。

//gcd使用步驟:

//1:創(chuàng)建線程隊列

//2:選擇執(zhí)行方式

//3;添加執(zhí)行任務(wù)

//4:任務(wù)被執(zhí)行

//創(chuàng)建串行隊列

//serial:串行

dispatch_queue_tserial =dispatch_queue_create("serial",DISPATCH_QUEUE_SERIAL);

//創(chuàng)建并行隊列

//concurrent:并行

dispatch_queue_tconcurrent =dispatch_queue_create("concurrent",DISPATCH_QUEUE_CONCURRENT);

//同步串行

dispatch_sync(serial, ^{

for(inti =0; i <10; i++) {

NSLog(@"同步串行執(zhí)行一:%d",i);

}

});

dispatch_sync(serial, ^{

for(inti =0; i <10; i++) {

NSLog(@"同步串行執(zhí)行二:%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;

}

解釋:設(shè)置image操作方法放在runloop的NSDefaultRunLoopMode模式下,當(dāng)操作UITableView滾動時,設(shè)置Image暫時休眠,等待DidEndScroll被喚醒.

同理,如果是耗時操作都是同樣的思路.

(2) NSTimer

runtime

(1)iOS runtime實戰(zhàn)應(yīng)用:成員變量和屬性

http://www.reibang.com/p/d361f169423b

(2)[iOS] runtime的使用場景--實戰(zhàn)篇

http://www.reibang.com/p/07b6c4a40a90

描述一個你遇到過的retain cycle例子浮禾。(別撒謊交胚,你肯定遇到過)

答:比如說block里引用self的屬性

+(void)load; +(void)initialize;有什么用處盈电?

答:比如說runtime的method swizzling方法調(diào)換功能可以寫在load類方法中(一定會調(diào)用),initialize在該類被使用時才被調(diào)用.

為什么其他語言里叫函數(shù)調(diào)用蝴簇,objective c里則是給對象發(fā)消息(或者談下對runtime的理解)

這題考查的是objective c這門語言的dynamic特性,需要對比c++這類傳統(tǒng)靜態(tài)方法調(diào)用才能理解挣轨。最好能說出一個對象收到message之后的完整的流程是如何的军熏。對runtime有完整理解的候選人還能說出oc的對象模型轩猩。

什么是method swizzling?

答:動態(tài)交換方法卷扮。

UIViewCALayer是啥關(guān)系?

能答出UIView是CALayer的delegate就及格了荡澎,能說出UIView主要處理事件,CALayer負(fù)責(zé)繪制就更好晤锹,再聊下二者在使用過程中對動畫流暢性影響的注意點就superb摩幔。UI流暢性是個大話題,推薦看下這兩篇文章鞭铆。中餐或衡,西餐

如何高性能的給UIImageView加個圓角车遂?(不準(zhǔn)說layer.cornerRadius!

https://github.com/panghaijiao/HJCornerRadius

http://www.olinone.com/?p=484

這題討論的最多封断,還有說美工切圖就搞定的。答主在項目里做過圓角頭像的處理舶担,里面的坑還真不少坡疼。cornerRadius會導(dǎo)致offscreen drawing有性能問題,美工切圖無法適用有背景圖的場景衣陶,即使加上shouldRasterize也有cache實效問題柄瑰。正確的做法是切換到工作線程利用CoreGraphic API生成一個offscreen UIImage,再切換到main thread賦值給UIImageView剪况。這里還涉及到UIImageView復(fù)用教沾,圓角頭像cache緩存(不能每次都去繪制),新舊頭像替換等等邏輯译断。還有其他的實現(xiàn)方式授翻,但思路離不開工作線程與主線程切換。

使用drawRect有什么影響镐作?(這個可深可淺藏姐,你至少得用過。该贾。)

不少同學(xué)都用過drawRect或者看別人用過羔杨,但不知道這個api存在的含義。這不僅僅是另一種做UI的方式杨蛋。drawRect會利用CPU生成offscreen bitmap兜材,從而減輕GPU的繪制壓力,用這種方式最UI可以將動畫流暢性優(yōu)化到極致逞力,但缺點是繪制api復(fù)雜曙寡,offscreen cache增加內(nèi)存開銷。UI動畫流暢性的優(yōu)化主要平衡CPU和GPU的工作壓力寇荧。推薦一篇文章:西餐

ASIHttpRequest或者SDWebImage里面給UIImageView加載圖片的邏輯是什么樣的举庶?(把UIImageView放到UITableViewCell里面問更贊)

很多同學(xué)沒有讀源碼的習(xí)慣,別人的輪子拿來只是用用卻不知道真正的營養(yǎng)都在源代碼里面揩抡。這兩個經(jīng)典的framework代碼并不復(fù)雜户侥,很值得一讀镀琉。能對一個UIImageView怎么通過url展示一張圖片有完整的理解。涉及到的知識點也非常多蕊唐,UITableViewCell的復(fù)用屋摔,memory cache, disk cache,多線程切換,甚至http協(xié)議本身都需要有一定的涉及替梨。

麻煩你設(shè)計個簡單的圖片內(nèi)存緩存器(移除策略是一定要說的)

內(nèi)存緩存是個通用話題钓试,每個平臺都會涉及到。cache算法會影響到整個app的表現(xiàn)副瀑。候選人最好能談下自己都了解哪些cache策略及各自的特點弓熏。常見的有FIFO,LRU,LRU-2,2Q等等。由于NSCache的緩存策略不透明糠睡,一些app開發(fā)者會選擇自己做一套cache機制硝烂,其實并不難。

講講你用Instrument優(yōu)化動畫性能的經(jīng)歷吧(別問我什么是Instrument

Apple的instrument為開發(fā)者提供了各種template去優(yōu)化app性能和定位問題铜幽。很多公司都在趕feature滞谢,并沒有充足的時間來做優(yōu)化,導(dǎo)致不少開發(fā)者對instrument不怎么熟悉除抛。但這里面其實涵蓋了非常完整的計算機基礎(chǔ)理論知識體系狮杨,memory,disk到忽,network橄教,thread竹伸,cpu书在,gpu等等怔昨,順藤摸瓜去學(xué)習(xí)悍缠,是一筆巨大的知識財富。動畫性能只是其中一個template澈灼,重點還是理解上面問題當(dāng)中CPU GPU如何配合工作的知識絮缅。

loadView是干嘛用的怎燥?

不要就簡單的告訴我沒用過负饲,至少問下我有什么用堤魁。。這里是apple給開發(fā)者自己設(shè)置custom view的位置返十。說UI熟悉的一定要知道妥泉。

viewWillLayoutSubView你總是知道的。洞坑。

controller layout觸發(fā)的時候盲链,開發(fā)者有機會去重新layout自己的各個subview。說UI熟悉的一定要知道。

GCD里面有哪幾種Queue刽沾?你自己建立過串行queue嗎瓢剿?背后的線程模型是什么樣的?

兩種queue悠轩,串行和并行。main queue是串行攻泼,global queue是并行火架。有些開發(fā)者為了在工作線程串行的處理任務(wù)會自己建立一個serial queue。背后是蘋果維護的線程池忙菠,各種queue要用線程都是這個池子里取的何鸡。GCD大家都用過,但很多關(guān)鍵的概念不少人都理解的模凌兩可牛欢。串行骡男,并行,同步傍睹,異步是GCD的核心概念隔盛。

用過coredata或者sqlite嗎?讀寫是分線程的嗎拾稳?遇到過死鎖沒吮炕?咋解決的?

沒用過sqlite是說不過去的访得。用過CoreData的肯定有很多血淚史要說龙亲。多謝線程模型你肯定做過比較選擇。死鎖是啥肯定也是要知道的悍抑,沒遇到過至少能舉個簡單的例子來說明鳄炉。單個線程可以死鎖(main thread里dispatch_sync到main queue),多個線程直接也可以死鎖(A搜骡,B線程互相持有對方需要的資源且互相等待)拂盯。

httppostget啥區(qū)別?(區(qū)別挺多的记靡,麻煩多說點)

這個可以說很多磕仅。不希望聽到的答案有

兩個差不多,隨便用一個簸呈。

post比get安全(其實兩個都不安全)

能說下兩個http格式有什么不同榕订,各自應(yīng)用的場景就合格了。更多可以閱讀下這個答案蜕便。

我知道你大學(xué)畢業(yè)過后就沒接觸過算法數(shù)據(jù)結(jié)構(gòu)了劫恒,但是請你一定告訴我什么是Binary search tree? search的時間復(fù)雜度是多少?我很想知道!

很多人都很排斥數(shù)據(jù)結(jié)構(gòu)和算法題两嘴,我個人意見是復(fù)雜的可以不知道丛楚,基礎(chǔ)的一定要了解。時間復(fù)雜度是什么得知道憔辫,list趣些,queue,stack贰您,table坏平,tree這些都要明白是啥。連hash表的概念都不知道怎么能保證在寫代碼的時候注意性能呢锦亦。

如何自己高效實現(xiàn)NSUserDefault?

NSUserDefaults *mySettingData = [NSUserDefaults standardUserDefaults];

創(chuàng)建NSUserDefaults對象之后即可往里面添加數(shù)據(jù)舶替,它支持的數(shù)據(jù)類型有NSString、NSNumber杠园、NSDate顾瞪、NSArray、NSDictionary抛蚁、BOOL陈醒、NSInteger、NSFloat等系統(tǒng)定義的數(shù)據(jù)類型瞧甩,如果要存放自定義的對象(如自定義的類對象)孵延,則必須將其轉(zhuǎn)換成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實現(xiàn)長連接?

如果瀏覽器或者服務(wù)器在其頭信息加入了這行代碼

Connection:keep-alive

談下Objective C都有哪些鎖機制亲配,你一般用哪個尘应?

http://blog.csdn.net/roger_jin/article/details/45307951

常用:@synchronized代碼塊


如何終止正在運行的工作線程?

NSthread 有 cancel方法

NSOperation:隊列的取消吼虎,暫停和恢復(fù)

(1)取消隊列的所有操作

- (void)cancelAllOperations;

提?:也可以調(diào)用NSOperation的- (void)cancel?法取消單個操作

(2)暫停和恢復(fù)隊列

- (void)setSuspended:(BOOL)b; // YES代表暫停隊列,NO代表恢復(fù)隊列

- (BOOL)isSuspended; //當(dāng)前狀態(tài)

(3)暫停和恢復(fù)的適用場合:在tableview界面犬钢,開線程下載遠程的網(wǎng)絡(luò)界面,對UI會有影響思灰,使用戶體驗變差玷犹。那么這種情況,就可以設(shè)置在用戶操作UI(如滾動屏幕)的時候洒疚,暫停隊列(不是取消隊列)歹颓,停止?jié)L動的時候,恢復(fù)隊列油湖。

列舉iOS下的幾種本地持久化方案

plist文件(屬性列表)

preference(偏好設(shè)置)

NSKeyedArchiver(歸檔)

SQLite 3

CoreData

Realm

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末巍扛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子乏德,更是在濱河造成了極大的恐慌撤奸,老刑警劉巖吠昭,帶你破解...
    沈念sama閱讀 211,423評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異胧瓜,居然都是意外死亡矢棚,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評論 2 385
  • 文/潘曉璐 我一進店門府喳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蒲肋,“玉大人,你說我怎么就攤上這事钝满《嫡常” “怎么了?”我有些...
    開封第一講書人閱讀 157,019評論 0 348
  • 文/不壞的土叔 我叫張陵舱沧,是天一觀的道長。 經(jīng)常有香客問我偶洋,道長熟吏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,443評論 1 283
  • 正文 為了忘掉前任玄窝,我火速辦了婚禮牵寺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘恩脂。我一直安慰自己帽氓,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,535評論 6 385
  • 文/花漫 我一把揭開白布俩块。 她就那樣靜靜地躺著黎休,像睡著了一般。 火紅的嫁衣襯著肌膚如雪玉凯。 梳的紋絲不亂的頭發(fā)上势腮,一...
    開封第一講書人閱讀 49,798評論 1 290
  • 那天,我揣著相機與錄音漫仆,去河邊找鬼捎拯。 笑死,一個胖子當(dāng)著我的面吹牛盲厌,可吹牛的內(nèi)容都是我干的署照。 我是一名探鬼主播,決...
    沈念sama閱讀 38,941評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼吗浩,長吁一口氣:“原來是場噩夢啊……” “哼建芙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起懂扼,我...
    開封第一講書人閱讀 37,704評論 0 266
  • 序言:老撾萬榮一對情侶失蹤岁钓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屡限,經(jīng)...
    沈念sama閱讀 44,152評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡品嚣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,494評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了钧大。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翰撑。...
    茶點故事閱讀 38,629評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖啊央,靈堂內(nèi)的尸體忽然破棺而出眶诈,到底是詐尸還是另有隱情,我是刑警寧澤瓜饥,帶...
    沈念sama閱讀 34,295評論 4 329
  • 正文 年R本政府宣布逝撬,位于F島的核電站,受9級特大地震影響乓土,放射性物質(zhì)發(fā)生泄漏宪潮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,901評論 3 313
  • 文/蒙蒙 一趣苏、第九天 我趴在偏房一處隱蔽的房頂上張望狡相。 院中可真熱鬧,春花似錦食磕、人聲如沸尽棕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽滔悉。三九已至,卻和暖如春单绑,著一層夾襖步出監(jiān)牢的瞬間氧敢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評論 1 266
  • 我被黑心中介騙來泰國打工询张, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留孙乖,地道東北人。 一個月前我還...
    沈念sama閱讀 46,333評論 2 360
  • 正文 我出身青樓份氧,卻偏偏與公主長得像唯袄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蜗帜,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,499評論 2 348

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

  • 從哪說起呢恋拷? 單純講多線程編程真的不知道從哪下嘴。厅缺。 不如我直接引用一個最簡單的問題蔬顾,以這個作為切入點好了 在ma...
    Mr_Baymax閱讀 2,739評論 1 17
  • 目錄(GCD): 關(guān)鍵詞 混淆點 場景應(yīng)用 總結(jié) 1. 關(guān)鍵詞 線程概念: 獨立執(zhí)行的代碼段宴偿,一個線程同時間只能執(zhí)...
    Ryan___閱讀 1,264評論 0 3
  • 背景 擔(dān)心了兩周的我終于輪到去醫(yī)院做胃鏡檢查了!去的時候我都想好了最壞的可能(胃癌)诀豁,之前在網(wǎng)上查的癥狀都很相似窄刘。...
    Dely閱讀 9,229評論 21 42
  • iOS中GCD的使用小結(jié) 作者dullgrass 2015.11.20 09:41*字?jǐn)?shù) 4996閱讀 20199...
    DanDanC閱讀 820評論 0 0
  • 早上去上學(xué),還沒有走幾步呢舷胜,航航就不想走路了娩践。看著時間一分一秒地流失烹骨,我心里干著急翻伺。一把把他抱起來了,靈機一動沮焕,便...
    蘇_8ab1閱讀 202評論 0 3