iOS面试知识点梳理
1.iOS開發(fā)者賬號類型
- “個人”開發(fā)者可以申請升級“公司”,可以通過撥打蘋果公司客服電話(400 6701 855)來咨詢和辦理。
- 公司賬號允許多個開發(fā)者進(jìn)行協(xié)作開發(fā),比個人多一些帳號管理的設(shè)置,可設(shè)置多個Apple ID,分4種管理級別的權(quán)限。申請公司賬號需要填寫公司的鄧白氏編碼(DUNS Number)。
- 需要注意的是,企業(yè)賬號開發(fā)的應(yīng)用不能上線App Store,適合那些不希望公開發(fā)布應(yīng)用的企業(yè)。同樣,申請時也需要公司的鄧白氏編碼(DUNS Number)。
2.Property屬性
1.原子性:nonatomic 、atomic
2.讀寫: readwrite 、readonly
3.方法名:getter=<name>、setter=<name>
4.內(nèi)存:strong、retain、copy、weak、assign 、unsafe_unretained
atomic:原子性,只有一個線程可以同時訪問實(shí)例。atomic 是線程安全的,至少在當(dāng)前的讀取器是安全的。雖然它是一個默認(rèn)屬性,但是由于其使用同步鎖開銷較大,會損耗性能。
nonatomic:非原子性的,可以被多個線程訪問。效率要比atomic 高,但是不能保證其在多線程狀態(tài)下的安全性,在單線程和明確只有一個線程訪問的情況下被廣泛使用。
readwrite(默認(rèn)值):表示其同時擁有g(shù)etter 和 setter 方法;
readonly:只讀操作,其只有g(shù)etter 方法,沒有setter法
注:如果某個實(shí)例只允許被外部讀取,而不能寫入操作,同時在類實(shí)現(xiàn)文件當(dāng)中可以寫入的話,可以在頭文件中聲明屬性為只讀的,在實(shí)現(xiàn)文件中設(shè)置其為可讀寫的屬性,寫法如下:
getter=<name>的樣式:
@property (nonatomic, getter=isOn) BOOL on;
?
assign:用于值類型(如int,float等)
weak: 用于修飾引用類型
unsafe_unretained:只修飾引用類型
區(qū)別:
strong:用于引用類型,強(qiáng)引用。
retain :用于引用類型,強(qiáng)引用。
copy:修飾屬性會在內(nèi)存里拷貝對象。
區(qū)別:
?
3.了解沙盒的目錄結(jié)構(gòu)
iOS應(yīng)用沙盒即文件系統(tǒng)目錄,與其他應(yīng)用的文件系統(tǒng)隔離
?
-
Documents:保存應(yīng)用運(yùn)行時生成的需要持久化的數(shù)據(jù),如游戲進(jìn)度、涂鴉軟件的繪圖等信息, 該目錄會被iTunes同步備份。
-
Library/Caches:保存應(yīng)用運(yùn)行時生成的需要持久化的數(shù)據(jù),iTunes同步設(shè)備時不會備份該目錄。一般存儲體積大、不需要備份的非重要數(shù)據(jù),如緩存圖片或者離線數(shù)據(jù)(地圖等)。
-
Library/Preference:保存應(yīng)用的所有偏好設(shè)置,iOS的Settings(設(shè)置)應(yīng)用會在該目錄中查找應(yīng)用的設(shè)置信息。iTunes同步設(shè)備時會備份該目錄。
-
tmp:保存應(yīng)用運(yùn)行時所需的臨時數(shù)據(jù),使用完畢后再將相應(yīng)的文件從該目錄刪除。應(yīng)用沒有運(yùn)行時,系統(tǒng)也可能會清除該目錄下的文件。iTunes同步設(shè)備時不會備份該目錄。重新手機(jī)、系統(tǒng)磁盤不足時都會被清理
4.理解內(nèi)存中的區(qū)域劃分
棧區(qū)(stack):由系統(tǒng)自動分配和釋放,存放局部變量的值,容量小速度快,有序
堆:一般由程序員分配和釋放,如果不釋放,則出現(xiàn)內(nèi)存泄露。程序會回收您的內(nèi)存,特點(diǎn):容量大,速度慢,無序
靜態(tài)存儲區(qū):全局變量(外部變量)和靜態(tài)變量都存放在靜態(tài)區(qū)域。當(dāng)程序結(jié)束使,系統(tǒng)回收
常量區(qū):存放常量的內(nèi)存區(qū)域,程序結(jié)束時,系統(tǒng)回收
代碼區(qū):存放二進(jìn)制代碼的區(qū)域
5.理解iOS的遠(yuǎn)程推送
簡易推送流程:
(1) 應(yīng)用程序安裝后提示用戶是否需要接收推送,用戶確認(rèn)后注冊消息推送。
(2)App接收到從APNS Server獲取的令牌信息;
(3)APP將令牌信息發(fā)送到自己的服務(wù)器端;
(4)當(dāng)需要向用戶推送消息時,自己的服務(wù)器將向蘋果的推送通知服務(wù)器(Apple Push Notification Service,以下簡稱 APNS)發(fā)送通知;
(5)APNS 會向裝有此APP的iPhone設(shè)備發(fā)送消息
第三方推送的原理(以個推為例):
6.理解Block的使用
Block為什么要用copy
a、block在創(chuàng)建的時候默認(rèn)分配的內(nèi)存是在棧上,而不是在堆上。這樣的話其本身的作用域是屬于創(chuàng)建時候
的作用域,一旦在創(chuàng)建的作用域之外調(diào)用就會導(dǎo)致程序的崩潰。所以使用了copy將其拷貝到堆內(nèi)存上。
b、block創(chuàng)建在棧上,而block的代碼中可能會用到本地的一些變量,只有將其拷貝到堆上,才能用這些變量
Block為什么不用retain
retain這是增加了一次計(jì)數(shù),block的內(nèi)存還是在棧上,并沒有存在堆上,存在棧上的block可能隨時被系統(tǒng)回收。
為什么進(jìn)入block中的對象引用計(jì)數(shù)需要自動加1
Block執(zhí)行的是回調(diào),因此block并不知道其中的對象obj創(chuàng)建后會在什么時候被釋放,為了不在block使用obj之前,對象已經(jīng)被釋放,block就retain了obj一次
block和函數(shù)的關(guān)系
Block的使用很像函數(shù)指針,不過與函數(shù)最大的不同是Block可以訪問函數(shù)以外、詞法作用域以內(nèi)的外部變量的值。
換句話說,Block不僅 實(shí)現(xiàn)函數(shù)的功能,還能攜帶函數(shù)的執(zhí)行環(huán)境。
對于block的理解
block實(shí)際上是: 指向結(jié)構(gòu)體的指針
編譯器會將block的內(nèi)部代碼生成對應(yīng)的函數(shù)
對于基本數(shù)據(jù)類型,進(jìn)入到block中會被當(dāng)做常量處理
block默認(rèn)創(chuàng)建在棧上,所以對要對其進(jìn)行執(zhí)行copy操作,將其拷貝到堆區(qū),便于更好的操作對象。但是執(zhí)行了copy操作之后,block中使用self,此對象會被retain一次(注意:block在堆區(qū)上時才會起到retain作用),會造成循環(huán)引用。
解決方法:
在MRC下,使用__block修飾
在ARC下,使用__unsafe_unretained\weak修飾
7.理解循環(huán)引用出現(xiàn)的三種情況:
NSTimer
NSTimer對象timer作為一個對象A的屬性,本意在A的dealloc中釋放timer,但是timer沒有停止就不會觸發(fā)dealloc,然后就互相等待,造成循環(huán)引用。解決方法是顯式的調(diào)用timer的關(guān)閉方法[timer invaluate],再釋放A對象
Block
block代碼塊沒有配合weak使用
Delegate
聲明delegate時請用assign(MRC)或者weak(ARC)。
循環(huán)引用舉例:
NSMutableArray *firstArray = [NSMutableArray array]; NSMutableArray *secondArray = [NSMutableArray array]; [firstArray addObject:secondArray]; [secondArray addObject:firstArray];檢測循環(huán)引用
Xcode -> Product -> Pofile -> Leaks
8.理解指針的使用
用變量a給出下面的定義原文鏈接
a) 一個整型數(shù)
b) 一個指向整型數(shù)的指針
c) 一個指向指針的的指針,它指向的指針是指向一個整型數(shù)
d) 一個有10個整型數(shù)的數(shù)組
e) 一個有10個指針的數(shù)組,該指針是指向一個整型數(shù)的
f) 一個指向有10個整型數(shù)數(shù)組的指針
g) 一個指向函數(shù)的指針,該函數(shù)有一個整型參數(shù)并返回一個整型數(shù)
h) 一個有10個指針的數(shù)組,該指針指向一個函數(shù),該函數(shù)有一個整型參數(shù)并返回一個整型數(shù)
a) int a; // An integer
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer
h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer
9、理解iOS中的多線程
1.概念理解:
多線程是針對于單核的CPU來設(shè)計(jì)的,目的是為了讓CPU快速在多個線程之間進(jìn)行調(diào)度。
多線程的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):提高程序的執(zhí)行效率
缺點(diǎn):開啟線程需要一定的內(nèi)存空間
同步和異步:決定了可不可以開啟新的線程
同步:在當(dāng)前線程中執(zhí)行任務(wù),不具備開啟新線程的能力
異步:在新的線程中執(zhí)行任務(wù),具備開啟新線程的能力
并行與串行:決定了任務(wù)的執(zhí)行方式
并行:多個任務(wù)并發(fā)(同時)執(zhí)行。類型迅雷,多個任務(wù)同時開啟下載
串行:一個任務(wù)執(zhí)行完畢后,再執(zhí)行下一個任務(wù)。類似瀏覽器的一個接一個下載
iOS應(yīng)用程序中都是一個主線程,也成為UI線程
那么主線程的作用就是用來更新UI,顯示或者刷新界面
注意:不能將耗時的任務(wù)放在主線程上,否則會出現(xiàn)卡頓的現(xiàn)象。
?
2.iOS的三種多線程編程技術(shù)
NSThread
直接操作線程對象,但需要手動管理生命周期,而且經(jīng)常使用這種方式來查看當(dāng)前線程
GCD(Grand Central Dispatch)
底層使用的是C語言,靈活方便,可以根據(jù)系統(tǒng)負(fù)荷來增減線程,性能效率更好
Cocoa NSOperation
NSOperation對GCD的封裝,使用起來更好理解,將任務(wù)封裝為NSOpertaion,添加到NSOPerationQueue對象中
子類化NSOpertaion的設(shè)計(jì),更具有面向?qū)ο?#xff08;封裝,復(fù)用)的特性。更加適合在復(fù)雜項(xiàng)目中使用
3.進(jìn)程與線程
Progress和Thread,進(jìn)程和線程是操作系統(tǒng)里的基本概念
線程與進(jìn)程的區(qū)別:
線程是資源分配的最小單位,也是處理器調(diào)度的基本單位,但是進(jìn)程不是
進(jìn)程是資源擁有的單位,同一個進(jìn)程內(nèi)的線程共享進(jìn)程里的資源
多進(jìn)程,允許多個任務(wù)同時運(yùn)行
多線程,允許單個任務(wù)分為不同的部分運(yùn)行
10.了解音頻播放相關(guān)知識
音頻的播放從形式上分為音頻播放和音樂播放。
音頻播放:通常時間較短,不需要進(jìn)度控制,和循環(huán)控制。使用AudioToolbox.framework。
音樂播放:通常時間較長,需要進(jìn)行精準(zhǔn)控制。使用AVFoundation.framework。
音頻播放
AudioToolbox.framework是基于C語言的框架。
原理:將短音頻注冊的到系統(tǒng)聲音服務(wù)(System Sound Service)中。System Sound Service是一種簡單、底層的聲音播放服務(wù)。
1.音頻播放時間不能超過30秒。
2.數(shù)據(jù)必須是PCM或者IMA4格式。
3.音頻格式必須打包成.caf、.aif、wav中的一種。(這是官方說法,實(shí)際發(fā)現(xiàn)一些.mp3也可以)。
音樂播放
1.適合播放較大的音頻。
2.可以對音頻進(jìn)行精準(zhǔn)的播放控制
3.使用AVFoundataion.framework中的AVAudioPlayer來實(shí)現(xiàn)。
使用:
1.初始化AVAudioPlayer對象,通常是指定本地文件路徑
2.設(shè)置播放器屬性,例如重復(fù)次數(shù),音量大小等。
3.調(diào)用play方法播放。
注意:AVAudioPlayer一次只能播放一個音頻文件,所有的上一曲和下一曲都是通過創(chuàng)建多個AVAudioPlayer來實(shí)現(xiàn)的。
?
11.了解視頻播放相關(guān)知識
Apple已經(jīng)為我們提供了多種方法來實(shí)現(xiàn)視頻播放,包括MPMoviePlayerController,MPMoviePlayerViewController,AVPlayer,AVPlayerViewController等。而值得注意的是,上述的MPMoviePlayerController與MPMoviePlayerViewController在iOS9.0之后被棄用。下面是四種播放方式的區(qū)別:
11.理解OC中的反射機(jī)制
12.理解一個對象被創(chuàng)建需要的三個步驟
開辟內(nèi)存空間
初始化參數(shù)
返回內(nèi)存地址值
?
13.layoutSubView何時調(diào)用
1、 初始化方法事不會調(diào)用
2、滾動UIScrollview觸發(fā)
3、旋轉(zhuǎn)屏幕時觸發(fā)
4、改變View的值時候觸發(fā),前提是frame改變了
5、改變UIView的大小時觸發(fā)
14.理解NSOperationQueue
NSOperationQueue是存放NSOPeration的集合類,可以參考JAVA中的線程和線程池的概念。
雖說是queue,但并不是隊(duì)列的意思,并不遵守先進(jìn)先出。
所以我們可以理解為Pool ,即線程池。
15.理解OC是動態(tài)運(yùn)行時語言
OC將數(shù)據(jù)、對象類型的確定從編譯階段推遲到了運(yùn)行時。實(shí)現(xiàn)這一操作的基礎(chǔ)是面向?qū)ο笳Z言的多態(tài)特性。
這里面有有兩個關(guān)鍵字:運(yùn)行時和多態(tài)
運(yùn)行時:運(yùn)行時機(jī)制使我們知道運(yùn)行的時候才確定一個對象的類型、以及調(diào)用該類別對象指定的方法。
多態(tài):不同的對象以自己的方式來響應(yīng)相同的消息。子類的指針可以賦值給父類。
16.GCD的queue、main queue中執(zhí)行的代碼一定是在main thread么?
“queue中所執(zhí)行的代碼不一定在main thread中。如果queue是在主線程中創(chuàng)建的,那么所執(zhí)行的代碼就是在主線程中執(zhí)行。如果是在子線程中創(chuàng)建的,那么就不會在main thread中執(zhí)行。“
上述說法并不完全正確,queue中所執(zhí)行的代碼不一定在主線程是對的,但是隊(duì)列Queue中執(zhí)行的任務(wù)是在否在主線程與創(chuàng)建隊(duì)列所在的線程并無關(guān)系。
對于這個問題,首先總結(jié)幾個知識點(diǎn):
1.iOS中獲取隊(duì)列的三種方式:
主線程隊(duì)列:
主線程隊(duì)列為串行隊(duì)列,和主線程綁定。同普通串行隊(duì)列一樣,隊(duì)列中任務(wù)一次只能執(zhí)行一個,但是隊(duì)列中所有任務(wù)都在主線程中執(zhí)行(經(jīng)過測試,即使是異步添加的任務(wù),也沒有創(chuàng)建新的線程)。
全局隊(duì)列:
系統(tǒng)全局隊(duì)列為并發(fā)隊(duì)列,根據(jù)不同的優(yōu)先級(HIGH、DEFAULT、LOW、BACKGROUND)有四個。
自定義隊(duì)列:
系統(tǒng)提供方法,可以自定義創(chuàng)建串行和并行隊(duì)列。
2.同步與異步,串行與并行
同步與異步:決定可不可以開啟新的線程
同步:在當(dāng)前線程立即執(zhí)行添加的任務(wù),不具備開啟新線程的能力。
異步:在新的線程中執(zhí)行任務(wù),具備開啟新線程的能力
并行與串行:決定了任務(wù)的執(zhí)行方式
并行:可以多個任務(wù)并發(fā)(同時)執(zhí)行。類型迅雷,多個任務(wù)同時開啟下載
串行:一個任務(wù)執(zhí)行完畢后,再執(zhí)行下一個任務(wù)。類似瀏覽器的一個接一個下載
?
總結(jié):隊(duì)列Queue中執(zhí)行的任務(wù)是在否在主線程與創(chuàng)建隊(duì)列所在的線程無關(guān)。
判斷一個任務(wù)是不是在主線程,我們可以首先判斷同步還是異步,因?yàn)楫惒讲啪哂虚_啟新線程的能力。然而我們還需要注意兩點(diǎn):
1.主線程所在隊(duì)列為串行隊(duì)列,添加同步會導(dǎo)致死鎖。
2.并非所有的異步任務(wù)都不在主線程中,主線程隊(duì)列中添加異步任務(wù),并不開啟新的線程。
?
17.常見的Http狀態(tài)碼有哪些?
302是請求重定向。
500及以上是服務(wù)器錯誤,如503表示服務(wù)器找不到、3840表示服務(wù)器返回?zé)o效JSON。
400及以上是請求鏈接錯誤或者找不到服務(wù)器,如常見的404。
200及以上是正確,如常見的是200表示請求正常。
更多參考: Http狀態(tài)碼詳細(xì)說明
?
18.Runloop和線程的關(guān)系?
19.什么是消息轉(zhuǎn)發(fā)機(jī)制,類和分類同時調(diào)用一個方法會發(fā)生發(fā)生什么事情?
20.給一個首頁添加一個頭部如何實(shí)現(xiàn)?
21.組件之間如何解耦?
22.同步隊(duì)列中block中執(zhí)行異步操作,會發(fā)生什么事情?
23.runtime怎么理解的?
24.如果分類和原類擁有相同方法會發(fā)生什么事情:
如果分類中有和原有類同名的方法, 會優(yōu)先調(diào)用分類中的方法, 就是說會忽略原有類的方法。所以同名方法調(diào)用的優(yōu)先級為 分類 > 本類 > 父類。因此在開發(fā)中盡量不要覆蓋原有類;
25.動態(tài)庫和靜態(tài)庫的區(qū)別:
總結(jié)
對于細(xì)碎知識點(diǎn)的學(xué)習(xí),經(jīng)過了不斷的測試和理解,我們才會發(fā)現(xiàn)還有太多值得研究的地方。如果有不對的地方我會盡快更正。
?
?
?
?
?
?
?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/coolcold/p/9799073.html
總結(jié)
以上是生活随笔為你收集整理的iOS面试知识点梳理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习ASP.NET Core Razor
- 下一篇: git遇到的问题-- Another g