二菠净、iOS經(jīng)典面試題(一)

我為什么要寫這篇文章

  • 自己歸納總結(jié)禁舷,為校招做準備
  • 方便自己隨時查閱,鞏固記憶
  • 予人玫瑰手有余香

一毅往、簡述iOS中UIViewController的生命周期

先來看一張那個圖

生命周期

一般一個UIViewController從被創(chuàng)建到顯示在屏幕上會經(jīng)歷如下過程
1牵咙、alloc 創(chuàng)建對象并在內(nèi)存中開辟一塊空間
2、init(initWithNibName) 初始化控制器對象并且初始化數(shù)據(jù)
3攀唯、loadView 如果view不存在則會調(diào)用此方法洁桌,在控制器沒有被銷毀前此方法可能會執(zhí)行多次
4、viewDidLoad 在loadView方法執(zhí)行完成view被創(chuàng)建成功后執(zhí)行此方法侯嘀,一般這個方法只執(zhí)行一次
5另凌、 viewWillAppare 視圖將要顯示在屏幕上的時候調(diào)用
6、 viewWillLayoutSubviews 視圖將要布局子控件時候調(diào)用
7戒幔、 viewDidLayoutSubviews 視圖剛剛布局好子控件時候調(diào)用
8吠谢、 viewDidAppear 視圖加載到窗口時調(diào)用
9、 viewWillDisappear 視圖即將消失溪食、被覆蓋或是隱藏時調(diào)用
10囊卜、viewDidDisappear 視圖已經(jīng)消失、被覆蓋或是隱藏時調(diào)用

  • storyboard加載的是控制器及控制器view错沃,而xib加載的僅僅只是控制器的view
  • 控制器view的生命周期:viewDidLoad -> viewWillAppear -> viewWillLayoutSubviews -> viewDidLayoutSubviews
    -> viewDidAppear -> viewWillDisappear -> viewDidDisappear
  • 重寫loadView方法栅组,則會根據(jù)重寫的loadView方法創(chuàng)建view
  • viewDidLoad被執(zhí)行多次的情況:A控制器push到B控制器,此時枢析,窗口顯示的是B控制器的view玉掸,如果收到內(nèi)存警告,一般會將A控制器中沒用的變量及view銷毀掉醒叁,之后當我們從B控制器pop到A控制器時司浪,就會再次執(zhí)行A控制器的loadView方法與viewDidLoad方法。

二把沼、什么是響應(yīng)者鏈啊易,它是怎么工作的

首先了解下響應(yīng)者對象這個概念:響應(yīng)者對象指的是有響應(yīng)和處理事件能力的對象。iOS中所有響應(yīng)者對象都繼承于UIResponder


UIResponder

所謂響應(yīng)者鏈就是講一系列響應(yīng)者鏈式地串聯(lián)起來饮睬,形成一條響應(yīng)鏈租谈,當某一對象不能處理事件時就將事件傳遞給下一個響應(yīng)者對象。我們來看一張圖

響應(yīng)者鏈

拓展:

  • 響應(yīng)鏈通常是由一個個UIView組成的
  • 一個視圖的下一個響應(yīng)者是它視圖控制器(UIViewController)(如果有的話)捆愁,然后再轉(zhuǎn)給它的父視圖(Super View)
  • 視圖控制器(如果有的話)的下一個響應(yīng)者為其管理的視圖的父視圖
  • UIWindow的下一個響應(yīng)者為UIApplication
  • UIApplication是一條響應(yīng)鏈的終點

三割去、什么是序列化窟却,怎么將一個包含自定義對象的數(shù)組序列化到磁盤

所謂序列化就是將對象狀態(tài)轉(zhuǎn)換為可保持或者可傳輸格式的過程。在iOS中實現(xiàn)序列化只要實現(xiàn)NSCoding協(xié)議即可
我們先寫下如下代碼

#import "ViewController.h"
#import "Person.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    Person *person = [[Person alloc]init];
    NSArray *array = @[person];
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array];
    NSLog(@"%@---%@",array,data);
}

@end

這時我們command + R運行下你會看見如下錯誤:

error

這是因為我們沒有實現(xiàn)NSCoding協(xié)議方法呻逆,于是我們回到Person寫如下代碼:

#import "Person.h"

@interface Person()<NSCoding>

@end

@implementation Person

//序列化
- (instancetype)initWithCoder:(NSCoder *)aDecoder{
    if (self = [super init]){
        self = [aDecoder decodeObjectForKey:@"person"];
    }
    return self;
}

//反序列化
- (void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeObject:self forKey:@"person"];
}

@end

ok夸赫,現(xiàn)在運行下

success

總結(jié):

  • iOS中想要實現(xiàn)序列化和反序列化很簡單只要實現(xiàn)NSCoding協(xié)議中的initWithCoder和encodeWithCoder兩個方法就好了。

四咖城、你了解沙盒嗎茬腿,沙盒目錄結(jié)構(gòu)是怎樣的,什么是App Bundle酒繁,里面都有些什么

iOS沙盒可以簡單地理解成是一個目錄滓彰,而且我們修改這個目錄的時候?qū)Σ僮飨到y(tǒng)不會造成任何的損失,一個iOS APP的操作都是在自己的沙盒中進行的州袒。我們先來看一張圖


iOS沙盒

iOS沙盒結(jié)構(gòu):

  • Application : 存放程序源文件揭绑,上架前經(jīng)過數(shù)字簽名,上架后不可修改
  • Documents:常用目錄郎哭,iCloud備份目錄他匪,存放數(shù)據(jù),這里不能存緩存文件,否則上架不被通過
  • Library :
    • Caches:存放體積大又不需要備份的數(shù)據(jù)
    • Preference:設(shè)置目錄,iCloud會備份設(shè)置信息
  • tmp:存放臨時文件夸研,不會被備份邦蜜,而且這個文件下的數(shù)據(jù)有可能隨時被清除
    App Bundle中存放:
  • info.plist :這個文件是很重要的一個文件,里面存放著iOS應(yīng)用程序的配置信息亥至,系統(tǒng)依賴此文件來獲取應(yīng)用程序的有關(guān)信息
  • 可執(zhí)行文件:此文件包含應(yīng)用程序的入口和通過靜態(tài)連接到應(yīng)用程序target的代碼
  • 資源文件 : 存放圖片悼沈、音、視頻文件
  • 其他:可以嵌入定制的數(shù)據(jù)資源

五姐扮、在UIKit中絮供,frame與bounds的區(qū)別是什么

  • frame相對于父視圖,是父視圖坐標系下的位置和大小。bounds相對于自身,是自身坐標系下的位置和大小茶敏。
  • frame以父控件的左上角為坐標原點壤靶,bounds以自身的左上角為坐標原點

六、父類實現(xiàn)深拷貝時惊搏,子類如何實現(xiàn)深度拷貝贮乳。父類沒有實現(xiàn)深拷貝時,子類如何實現(xiàn)深度拷貝

  • 深拷貝同淺拷貝的區(qū)別:淺拷貝是指針拷貝恬惯,對一個對象進行淺拷貝向拆,相當于對指向該對象的指針進行復(fù)制,產(chǎn)生一個新的指向這個對象的指針酪耳,那么就是有兩個指針指向同一個對象亲铡,這個對象銷毀后兩個指針都應(yīng)該置空。深拷貝是對一個對象進行拷貝,相當于對對象進行復(fù)制奖蔓,產(chǎn)生一個新的對象,那么就有兩個指針分別 指向兩個對象讹堤。當一個對象改變或者被銷毀后拷貝出來的新的對象不受影響吆鹤。
  • 實現(xiàn)深拷貝需要實現(xiàn)NSCopying協(xié)議,實現(xiàn)- (id)copyWithZone:(NSZone *)zone 方法洲守。當對一個property屬性含有copy修飾符的時候疑务,在進行賦值操作的時候?qū)嶋H上就是調(diào)用這個方法。
  • 父類實現(xiàn)深拷貝之后梗醇,子類只要重寫copyWithZone方法知允,在方法內(nèi)部調(diào)用父類的copyWithZone方法,之后再進行對自己屬性的處理叙谨。
  • 父類沒有實現(xiàn)深拷貝温鸽,子類除了需要對自己的屬性進行處理,還要對父類的屬性進行處理手负。
    我們來看以下代碼
#import "ViewController.h"
#import "Person.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    Person *person = [[Person alloc]init];
    Person *aPerson = [person copy];
    NSLog(@"%p---%p",person,aPerson);
}

@end

運行后發(fā)現(xiàn)崩了涤垫,錯誤信息是

error

意思是我們沒有實現(xiàn)NSCopying協(xié)議中copyWithZone的方法,回到Person文件

#import "Person.h"

@interface Person()<

NSCopying>

@end

@implementation Person

- (instancetype)copyWithZone:(NSZone *)zone{
    return [[Person allocWithZone:zone]init];
}

@end

運行,ok成功了

success

拓展:

  • 在NSString中使用copy和mutableCopy竟终、
NSString *str = @"string";
NSString *cpStr = [str copy];
NSMutableString *mucpStr = [str mutableCopy];
NSLog(@"str:%p-%@-cpStr:%p-%@-mucpStr%p-%@",str,str,cpStr,cpStr,mucpStr,mucpStr);

我們來看下打印輸出

str:0x10b7ba138-string-cpStr:0x10b7ba138-string-mucpStr0x608000250cb0-string

從打印的信息可以看出當調(diào)用copy復(fù)制時是淺拷貝蝠猬,調(diào)用mutableCopy復(fù)制時是深拷貝,若拷貝的對象是可變對象時均為深拷貝统捶,這里沒有列出

  • 在定義屬性的時候copy和strong有什么區(qū)別
    當你用copy修飾一個屬性時榆芦,默認會在它的setter方法中實現(xiàn)copy方法,而用strong修飾的屬性是不會在其setter方法中實現(xiàn)copy方法的喘鸟。

七匆绣、KVO,NSNotification迷守,delegate及block區(qū)別

首先什么是KVO:
所謂KVO即Key-Value-Observing犬绒,是cocoa框架實現(xiàn)的觀察者模式,一般會和KVC一塊使用兑凿,通過KVO可以監(jiān)測某一個值的變化凯力,比如一個UIView高度的變化,是一對多的關(guān)系礼华,一個值的變化會通知所有的觀察者

[self.tableView addObserver: self forKeyPath:@"contentOffSet" options: NSKeyValueObservingOptionNew context: nil];
 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
    //做一些處理的操作
}

以上就給一個tableView添加了一個控制器作為它的觀察者咐鹤,當它有y軸上的偏移時,就會調(diào)用observeValueForKeyPath方法圣絮,更多關(guān)于[KVO]
(http://www.reibang.com/p/742b4b248da9)
NSNotification:
NSNotification是通知祈惶,也是一對多的使用場景隶垮。在某些情況下,KVO和NSNotification是一樣的民晒,都是狀態(tài)變化之后告知對方些己。NSNotification的特點,就是需要被觀察者先主動發(fā)出通知疹蛉,然后觀察者注冊監(jiān)聽后再來進行響應(yīng)活箕,比KVO多了發(fā)送通知的一步,但是其優(yōu)點是監(jiān)聽不局限于屬性的變化可款,還可以對多種多樣的狀態(tài)變化進行監(jiān)聽育韩,監(jiān)聽范圍廣,使用也更靈活闺鲸。

//發(fā)送通知
[[NSNotificationCenter defaultCenter]postNotificationName:@"notification" object:nil userInfo:@{@"key":@"value"}];
//添加通知
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(noted) name:@"notifiction" object:nil];
//注銷通知
[[NSNotificationCenter defaultCenter]removeObserver:self name:@"notification" object:nil];

delegate:
delegate 是代理筋讨,就是我不想做的事情交給別人做。比如狗需要吃飯摸恍,就通過delegate通知主人悉罕,主人就會給他做飯、盛飯误墓、倒水蛮粮,這些操作,這些狗都不需要關(guān)心谜慌,只需要調(diào)用delegate(代理人)就可以了然想,由其他類完成所需要的操作。所以delegate是一對一關(guān)系欣范。
block:
block是delegate的另一種形式变泄,是函數(shù)式編程的一種形式。使用場景跟delegate一樣恼琼,相比delegate更靈活妨蛹,而且代理的實現(xiàn)更直觀。
拓展:

  • KVO一般的使用場景是數(shù)據(jù)晴竞,需求是數(shù)據(jù)變化蛙卤,一般使用KVO(觀察者模式)
  • Notification 一般是進行全局通知,比如利好消息一出噩死,通知大家去買入颤难。Notification是弱關(guān)聯(lián),利好消息發(fā)出已维,你不需要知道是誰發(fā)的也可以做出相應(yīng)的反應(yīng)行嗤,同理發(fā)消息方也不需要知道接收方就可以正常發(fā)出消息。
  • delegate一般的使用場景是行為垛耳,需求是需要別人幫我做一件事情栅屏,比如買賣股票飘千,我們一般使用delegate。

八栈雳、 怎么將一個函數(shù)放到主線程中執(zhí)行

//方法一:GCD方法护奈,通過向主線程隊列發(fā)送一個block塊,使block里的方法可以在主線程中執(zhí)行甫恩。
dispatch_async(dispatch_get_main_queue(), ^{
  //需要執(zhí)行的方法
});

//方法二:NSOperationQueue
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue]; //主隊列
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
  //需要執(zhí)行的方法
}];
[mainQueue addOperation:operation];

//方法三:NSThread
[self performSelector:@selector(method) onThread:[NSThread mainThread] withObject:nil waitUntilDone:YES models:nil];
[self performSelectorOnMainThread:@selector(method) withObject:nil waitUntilDone:YES];
[[NSThread mainThread] performSelector:@selector(method) withObject:nil];

//方法四:Runloop
[[NSRunLoop mainRunLoop] performSelector:@selector(method) withObject:nil];

九逆济、當定時器repeats屬性設(shè)為YES時,能在dealloc中調(diào)用invalid嗎磺箕,為什么

不能在dealloc中調(diào)用, 因為一旦設(shè)置repeats為yes抛虫,計時器會強持有self松靡,導(dǎo)致dealloc永遠不會被調(diào)用,這個類就永遠無法被釋放建椰。比如可以在viewDidDisappear中調(diào)用雕欺,這樣當類需要被回收的時候就可以正常執(zhí)行dealloc方法了。
拓展:

  • 用scheduledTimerWithTimeInterval創(chuàng)建的NSTimer棉姐,在哪個線程創(chuàng)建就會被加入哪個線程的RunLoop中屠列,就運行在哪個線程。
  • 自己創(chuàng)建的Timer伞矩,加入到哪個線程的RunLoop中就運行在哪個線程笛洛,需要手動加入線程。

十乃坤、線程是什么?進程又是什么?區(qū)別和聯(lián)系

這是問的操作系統(tǒng)相關(guān)的了苛让,是基礎(chǔ)

  • 線程:線程是進程中一個獨立執(zhí)行的控制單元(路徑),一個進程至少包含一條線程,即主線程
  • 進程:正在運行的程序,負責程序的內(nèi)存分配,一個程序至少要有一個進程
  • 進程和線程都是一個時間段的描述湿诊,是CPU工作時間段的描述狱杰,進程是cpu資源分配的最小單位,線程是cpu調(diào)度的最小單位厅须。

==============================================================
未完待續(xù)仿畸。。朗和。
先總結(jié)十條吧错沽,希望對您面試有幫助,如有什么錯誤歡迎指正

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末例隆,一起剝皮案震驚了整個濱河市甥捺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌镀层,老刑警劉巖镰禾,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件皿曲,死亡現(xiàn)場離奇詭異,居然都是意外死亡吴侦,警方通過查閱死者的電腦和手機屋休,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來备韧,“玉大人劫樟,你說我怎么就攤上這事≈茫” “怎么了叠艳?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長易阳。 經(jīng)常有香客問我附较,道長,這世上最難降的妖魔是什么潦俺? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任拒课,我火速辦了婚禮,結(jié)果婚禮上事示,老公的妹妹穿的比我還像新娘早像。我一直安慰自己,他們只是感情好肖爵,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布卢鹦。 她就那樣靜靜地躺著,像睡著了一般遏匆。 火紅的嫁衣襯著肌膚如雪法挨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天幅聘,我揣著相機與錄音凡纳,去河邊找鬼。 笑死帝蒿,一個胖子當著我的面吹牛荐糜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播葛超,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼暴氏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了绣张?” 一聲冷哼從身側(cè)響起答渔,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎侥涵,沒想到半個月后沼撕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宋雏,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年务豺,在試婚紗的時候發(fā)現(xiàn)自己被綠了磨总。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡笼沥,死狀恐怖蚪燕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情奔浅,我是刑警寧澤馆纳,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站汹桦,受9級特大地震影響厕诡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜营勤,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望壹罚。 院中可真熱鬧葛作,春花似錦、人聲如沸猖凛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辨泳。三九已至虱岂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間菠红,已是汗流浹背第岖。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留试溯,地道東北人蔑滓。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像遇绞,于是被迫代替她去往敵國和親键袱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

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

  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,125評論 29 470
  • 1.Difference between shallow copy and deep copy? 淺復(fù)制和深復(fù)制的...
    用心在飛閱讀 989評論 0 9
  • 把網(wǎng)上的一些結(jié)合自己面試時遇到的面試題總結(jié)了一下摹闽,以后有新的還會再加進來蹄咖。 1. OC 的理解與特性 OC 作為一...
    AlaricMurray閱讀 2,546評論 0 20
  • 1. 父類實現(xiàn)深拷貝時,子類如何實現(xiàn)深度拷貝付鹿。父類沒有實現(xiàn)深拷貝時澜汤,子類如何實現(xiàn)深度拷貝蚜迅。 1.1 深拷貝同淺拷貝...
    iYeso閱讀 1,886評論 0 13
  • 多線程、特別是NSOperation 和 GCD 的內(nèi)部原理银亲。運行時機制的原理和運用場景慢叨。SDWebImage的原...
    LZM輪回閱讀 2,004評論 0 12