iOS 面試錦囊之筆試題一

??????

前言
我依稀的記得之前在刷微博的時(shí)候,在一個(gè)綜藝節(jié)目上亦歉,一個(gè)出道13年的歌手輸給了一個(gè)新手嘿棘。當(dāng)時(shí)導(dǎo)師說的這么一段話我覺得挺有道理的须误,原句我可能記得不是特別完整挨稿,大概意思就是:我不管你出道多少年或者以前有多大的成就,如果你當(dāng)場(chǎng)發(fā)揮的不穩(wěn)或者狀態(tài)不好京痢,不好就是不好奶甘。同時(shí)我覺得這句話用在面試上也是一樣的。我相信努力是會(huì)有回報(bào)的祭椰,如果努力最終沒有達(dá)到你心里的那個(gè)目標(biāo)值臭家,那說明你努力的還不夠疲陕。打敗你的往往不是別人,更也不是生活钉赁,而是你自己本身鸭轮。加油!i厦埂!

目錄
1邑蒋、設(shè)計(jì)模式是什么姓蜂? 你知道哪些設(shè)計(jì)模式,并簡(jiǎn)要敘述医吊?
2钱慢、MVC 和 MVVM 的區(qū)別?
3卿堂、#import跟 #include 有什么區(qū)別束莫,@class呢,#import<> 跟 #import“”有什么區(qū)別草描?
4览绿、frame 和 bounds 有什么不同?
5穗慕、Objective-C的類可以多重繼承么饿敲?沒有的話用什么代替?可以實(shí)現(xiàn)多個(gè)接口么逛绵?Category是什么怀各?重寫一個(gè)類的方式用繼承好還是分類好?為什么术浪?
6瓢对、@property 的本質(zhì)是什么?ivar胰苏、getter硕蛹、setter 是如何生成并添加到這個(gè)類中的?
7碟联、@property中有哪些屬性關(guān)鍵字以及作用妓美?
8、delegate 和 notification 的區(qū)別
9鲤孵、什么情況使用 weak 關(guān)鍵字壶栋,相比 assign 有什么不同?
10普监、self.跟self->什么區(qū)別贵试?
11琉兜、用@property聲明的 NSString / NSArray / NSDictionary 經(jīng)常使用 copy 關(guān)鍵字,為什么毙玻?如果改用strong關(guān)鍵字豌蟋,可能造成什么問題?
12桑滩、淺拷貝和深拷貝的區(qū)別梧疲?
13、這個(gè)寫法會(huì)出什么問題:@property (nonatomic, copy) NSMutableArray *arr;运准?
14幌氮、一個(gè)objc對(duì)象的isa的指針指向什么?有什么作用胁澳?
15该互、Objective-C 如何對(duì)內(nèi)存管理的,說說你的看法和解決方法韭畸?
16宇智、iOS UIViewController的完整生命周期?
17、以下代碼運(yùn)行結(jié)果如何胰丁?
18随橘、Object-C有私有方法嗎?私有變量呢锦庸?
19太防、關(guān)鍵字const什么含義?
20酸员、用偽代碼寫一個(gè)線程安全的單例模式
21蜒车、category 和 extension 的區(qū)別
22、tableView的重用機(jī)制幔嗦?
23酿愧、iOS 內(nèi)存的使用和優(yōu)化的注意事項(xiàng)?
24、iOS 你在項(xiàng)目中是怎么優(yōu)化內(nèi)存的邀泉?
25嬉挡、寫一個(gè)完整的代理,包括聲明汇恤、實(shí)現(xiàn)
26庞钢、iOS 你在項(xiàng)目中用過 GCD 嗎?舉個(gè)例子
27因谎、GCD 與 NSOperation 的區(qū)別
28基括、寫出使用GCD方式從子線程回到主線程的方法代碼
29、OC中創(chuàng)建線程的方法是什么财岔?如果在主線程中執(zhí)行代碼风皿,方法是什么河爹?
30、你是怎么封裝一個(gè)view的(有梗和故事)

1桐款、設(shè)計(jì)模式是什么咸这? 你知道哪些設(shè)計(jì)模式,并簡(jiǎn)要敘述魔眨?

設(shè)計(jì)模式是一套被 反復(fù)使用媳维、多數(shù)人知曉、經(jīng)過分類編目的遏暴、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)侨艾。

單例模式:單例模式確保某一個(gè)類只有一個(gè)實(shí)例,并提供一個(gè)訪問它的全劇訪問點(diǎn)拓挥。具體的詳情可點(diǎn)擊進(jìn)入查看
工廠模式:工廠父類負(fù)責(zé)定義創(chuàng)建產(chǎn)品對(duì)象的公共接口,而工廠子類則負(fù)責(zé)生產(chǎn)具體的產(chǎn)品對(duì)象袋励,即通過不停的工廠子類來創(chuàng)建不同的產(chǎn)品對(duì)象侥啤。具體的詳情可點(diǎn)擊進(jìn)入查看
代理模式 :為某個(gè)對(duì)象提供一個(gè)代理,并由這個(gè)代理對(duì)象控制對(duì)原對(duì)象的訪問茬故。具體的詳情可點(diǎn)擊進(jìn)入查看
適配器模式: 將一個(gè)接口轉(zhuǎn)換成客戶希望的另一個(gè)接口盖灸,使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。適配器模式的別名是包裝器模式(Wrapper)磺芭,是一種結(jié)構(gòu)型設(shè)計(jì)模式赁炎。具體的詳情可點(diǎn)擊進(jìn)入查看
裝飾者模式: 不改變?cè)袑?duì)象的前提下,動(dòng)態(tài)地給一個(gè)對(duì)象增加一些額外的功能钾腺。具體的詳情可點(diǎn)擊進(jìn)入查看


2徙垫、MVC 和 MVVM 的區(qū)別?

MVC
MVC(Model-View-Controller)模式結(jié)構(gòu)圖放棒,可分為三部分:模型(Model)姻报、視圖(View)、控制器(Controller)间螟。其在MVC模式中所扮演的角色分別為:
Model:模型管理應(yīng)用程序的數(shù)據(jù)吴旋,響應(yīng)有關(guān)其狀態(tài)信息(通常來自View)的請(qǐng)求,并響應(yīng)指令以更改狀態(tài)(通常來自Controller)厢破。
View:視圖管理數(shù)據(jù)的展示荣瑟。
Controller:控制器解釋用戶的輸入,并通知模型摩泪、視圖進(jìn)行狀態(tài)更新
所有通信都是單向的笆焰。
優(yōu)點(diǎn):對(duì)Controller進(jìn)行瘦身,將View內(nèi)部的細(xì)節(jié)封裝起來了见坑,外界不知道View內(nèi)部的具體實(shí)現(xiàn)
缺點(diǎn):View和Controller依賴于Model

MVVM
MVVM(Model View View-Model)就是為了解決過于臃腫的問題仙辟。MVVM的思想是將Controller中UI控制邏輯與業(yè)務(wù)邏輯進(jìn)行分離同波,并抽離出一個(gè)View-Model來完成UI控制的邏輯。而Controller只需要負(fù)責(zé)業(yè)務(wù)邏輯即可

唯一的區(qū)別是叠国,View-Model可以調(diào)用Model定義的方法未檩,從Model中獲取數(shù)據(jù)以用于View,并對(duì)數(shù)據(jù)進(jìn)行預(yù)處理粟焊,使View可以直接使用冤狡。View又可以向View-Model發(fā)出用戶的操作命令,從而更改Model项棠。MVVM實(shí)現(xiàn)了一種雙向綁定機(jī)制悲雳。

優(yōu)點(diǎn):降低了View和Model之間的耦合;分離了業(yè)務(wù)邏輯和視圖邏輯香追。
缺點(diǎn):View和Model雙向綁定導(dǎo)致bug難以定位合瓢,兩者中的任何一方出現(xiàn)問題,另一方也會(huì)出現(xiàn)問題透典;增加了膠水代碼晴楔。

3、#import跟 #include 有什么區(qū)別峭咒,@class呢税弃,#import<> 跟 #import“”有什么區(qū)別?

1>. #import是Objective-C導(dǎo)入頭文件的關(guān)鍵字凑队,#include是C/C++導(dǎo)入頭文件的關(guān)鍵字则果,使用#import頭文件會(huì)自動(dòng)只導(dǎo)入一次,不會(huì)重復(fù)導(dǎo)入漩氨。
2>.@class告訴編譯器某個(gè)類的聲明西壮,當(dāng)執(zhí)行時(shí),才去查看類的實(shí)現(xiàn)文件叫惊,可以解決頭文件的相互包含茸时。
3>. #import<>用來包含系統(tǒng)的頭文件#import””用來包含用戶頭文件赋访。


4可都、frame 和 bounds 有什么不同?

frame:該view在父view坐標(biāo)系統(tǒng)中的位置和大小蚓耽。(參照點(diǎn)是父view的坐標(biāo)系統(tǒng))

bounds:該view在本身坐標(biāo)系統(tǒng)中的位置和大小渠牲。(參照點(diǎn)是本身坐標(biāo)系統(tǒng))


5、Objective-C的類可以多重繼承么步悠?沒有的話用什么代替签杈?可以實(shí)現(xiàn)多個(gè)接口么?Category是什么?重寫一個(gè)類的方式用繼承好還是分類好答姥?為什么铣除?

OC不可以多繼承,OC是單繼承鹦付。有時(shí)可以用分類和協(xié)議來代替多繼承
可以實(shí)現(xiàn)多個(gè)接口(協(xié)議)
Category是類別尚粘;一般情況用分類好,用Category去重寫類的方法敲长,僅對(duì)本Category有效郎嫁,不會(huì)影響到其他類與原有類的關(guān)系。


6祈噪、@property 的本質(zhì)是什么泽铛?ivar、getter辑鲤、setter 是如何生成并添加到這個(gè)類中的盔腔?

@property 的本質(zhì)是:@property = ivar + getter + setter

“屬性” (property)有兩大概念:ivar(實(shí)例變量)、getter+setter(存取方法)
“屬性” (property)作為 Objective-C 的一項(xiàng)特性月褥,主要的作用就在于封裝對(duì)象中的數(shù)據(jù)弛随。 Objective-C 對(duì)象通常會(huì)把其所需要的數(shù)據(jù)保存為各種實(shí)例變量。實(shí)例變量一般通過“存取方法”(access method)來訪問吓坚。其中,“獲取方法” (getter)用于讀取變量值灯荧,而“設(shè)置方法” (setter)用于寫入變量值礁击。


7灼擂、@property中有哪些屬性關(guān)鍵字以及作用看彼?

nonatomic :非原子操作。決定編譯器生成的setter和getter方法是否是原子操作社搅,一般使用nonatomic厉斟,效率高挚躯。
atomic:多線程安全,但是性能低
strong:持有特性擦秽。setter方法將傳入?yún)?shù)先保留码荔,再賦值,傳入?yún)?shù)的retaincount會(huì)+1感挥。
copy :拷貝特性缩搅。setter方法將傳入對(duì)象復(fù)制一份,需要完全一份新的變量時(shí)触幼。
assign:用于基本數(shù)據(jù)類型
readwrite:可讀可寫特性硼瓣。需要生成getter方法和setter方法
readonly:只讀特性。只會(huì)生成getter方法置谦,不會(huì)生成setter方法堂鲤,不希望屬性在類外改變亿傅。
retain:相當(dāng)于ARC中的strong


8、delegate 和 notification 的區(qū)別

二者都用于傳遞消息瘟栖,不同之處主要在于一個(gè)是一對(duì)一的葵擎,另一個(gè)是一對(duì)多的
notification:不需要兩者之間有聯(lián)系,實(shí)現(xiàn)一對(duì)多消息的轉(zhuǎn)發(fā)
delegate:需要兩者之間必須建立聯(lián)系,不然沒法調(diào)用代理的方法


9慢宗、什么情況使用 weak 關(guān)鍵字坪蚁,相比 assign 有什么不同?

1>.在 ARC 中,在有可能出現(xiàn)循環(huán)引用的時(shí)候,往往要通過讓其中一端使用 weak 來解決,比如: delegate 代理屬性镜沽。
2>.自身已經(jīng)對(duì)它進(jìn)行一次強(qiáng)引用,沒有必要再?gòu)?qiáng)引用一次,此時(shí)也會(huì)使用 weak,自定義 IBOutlet 控件屬性一般也使用 weak(因?yàn)楦缚丶膕ubViews數(shù)組已經(jīng)對(duì)它有一個(gè)強(qiáng)引用)敏晤。

不同點(diǎn):
assign 可以用非 OC 對(duì)象,而 weak 必須用于 OC 對(duì)象缅茉。
weak 表明該屬性定義了一種“非擁有關(guān)系”嘴脾。在屬性所指的對(duì)象銷毀時(shí),屬性值會(huì)自動(dòng)清空(nil)蔬墩。


10译打、self.跟self->什么區(qū)別?

1>. self.是調(diào)用get方法或者set放
2>. self是當(dāng)前本身拇颅,是一個(gè)指向當(dāng)前對(duì)象的指針
3>. self->是直接訪問成員變量


11奏司、用@property聲明的 NSString / NSArray / NSDictionary 經(jīng)常使用 copy 關(guān)鍵字,為什么樟插?如果改用strong關(guān)鍵字韵洋,可能造成什么問題?

用 @property 聲明 NSString黄锤、NSArray搪缨、NSDictionary 經(jīng)常使用 copy 關(guān)鍵字,是因?yàn)樗麄冇袑?duì)應(yīng)的可變類型:NSMutableString鸵熟、NSMutableArray副编、NSMutableDictionary,他們之間可能進(jìn)行賦值操作(就是把可變的賦值給不可變的)流强,為確保對(duì)象中的字符串值不會(huì)無意間變動(dòng)痹届,應(yīng)該在設(shè)置新屬性值時(shí)拷貝一份。

1>. 因?yàn)楦割愔羔樋梢灾赶蜃宇悓?duì)象,使用 copy 的目的是為了讓本對(duì)象的屬性不受外界影響,使用 copy 無論給我傳入是一個(gè)可變對(duì)象還是不可對(duì)象,我本身持有的就是一個(gè)不可變的副本打月。
2>. 如果我們使用是 strong ,那么這個(gè)屬性就有可能指向一個(gè)可變對(duì)象,如果這個(gè)可變對(duì)象在外部被修改了,那么會(huì)影響該屬性短纵。
總結(jié):使用copy的目的是,防止把可變類型的對(duì)象賦值給不可變類型的對(duì)象時(shí)僵控,可變類型對(duì)象的值發(fā)送變化會(huì)無意間篡改不可變類型對(duì)象原來的值香到。


12、淺拷貝和深拷貝的區(qū)別?

淺拷貝:對(duì)一個(gè)對(duì)象地址的拷貝悠就。源對(duì)象和副本對(duì)象是同一對(duì)象
深拷貝:對(duì)一個(gè)對(duì)象的拷貝千绪。源對(duì)象和副本對(duì)象是不同的兩個(gè)對(duì)象


13、這個(gè)寫法會(huì)出什么問題:@property (nonatomic, copy) NSMutableArray *arr;梗脾?

問題:添加,刪除,修改數(shù)組內(nèi)的元素的時(shí)候,程序會(huì)因?yàn)檎也坏綄?duì)應(yīng)的方法而崩潰荸型。

-[__NSArrayI removeObjectAtIndex:]: 
unrecognized selector sent to instance 0x7fcd1bc30460

copy后返回的是不可變對(duì)象(即 arr 是 NSArray 類型,NSArray 類型對(duì)象不能調(diào)用 NSMutableArray 類型對(duì)象的方法)
原因: copy 就是復(fù)制一個(gè)不可變 NSArray 的對(duì)象炸茧,不能對(duì) NSArray 對(duì)象進(jìn)行添加/修改瑞妇。


14、一個(gè)objc對(duì)象的isa的指針指向什么梭冠?有什么作用辕狰?

指向他的類對(duì)象,從而可以找到對(duì)象上的方法


15、Objective-C 如何對(duì)內(nèi)存管理的控漠,說說你的看法和解決方法蔓倍?

Objective-C的內(nèi)存管理主要有三種方式ARC(自動(dòng)內(nèi)存計(jì)數(shù))、手動(dòng)內(nèi)存計(jì)數(shù)盐捷、內(nèi)存池偶翅。
1>. 自動(dòng)內(nèi)存計(jì)數(shù)ARC:由Xcode自動(dòng)在App編譯階段,在代碼中添加內(nèi)存管理代碼碉渡。
2>. 手動(dòng)內(nèi)存計(jì)數(shù)MRC:遵循內(nèi)存誰申請(qǐng)聚谁、誰釋放;誰添加滞诺,誰釋放的原則形导。
3>. 內(nèi)存釋放池Release Pool:把需要釋放的內(nèi)存統(tǒng)一放在一個(gè)池子中,當(dāng)池子被抽干后(drain)铭段,池子中所有的內(nèi)存空間也被自動(dòng)釋放掉骤宣。內(nèi)存池的釋放操作分為自動(dòng)和手動(dòng)秦爆。自動(dòng)釋放受runloop機(jī)制影響序愚。


16、iOS UIViewController的完整生命周期?

按照?qǐng)?zhí)行順序排列:

1>. initWithCoder:通過nib文件初始化時(shí)觸發(fā)等限。
2>. awakeFromNib:nib文件被加載的時(shí)候爸吮,會(huì)發(fā)生一個(gè)awakeFromNib的消息到nib文件中的每個(gè)對(duì)象。
3>. loadView:開始加載視圖控制器自帶的view望门。
4>. viewDidLoad:視圖控制器的view被加載完成形娇。
5>. viewWillAppear:視圖控制器的view將要顯示在window上。
6>. updateViewConstraints:視圖控制器的view開始更新AutoLayout約束筹误。
7>. viewWillLayoutSubviews:視圖控制器的view將要更新內(nèi)容視圖的位置桐早。
8>. viewDidLayoutSubviews:視圖控制器的view已經(jīng)更新視圖的位置。
9>. viewDidAppear:視圖控制器的view已經(jīng)展示到window上。
10>. viewWillDisappear:視圖控制器的view將要從window上消失哄酝。
11>.viewDidDisappear:視圖控制器的view已經(jīng)從window上消失友存。


17、以下代碼運(yùn)行結(jié)果如何陶衅?
- (void)viewDidLoad {

[super viewDidLoad];

NSLog(@"1");

dispatch_sync(dispatch_get_main_queue(), ^{

NSLog(@"2");
});

NSLog(@"3");
}

只輸出:1屡立。(主線程死鎖,因?yàn)関iewDidLoad方法默認(rèn)開了一條主線程,然后又執(zhí)行dispatch_sync(dispatch_get_main_queue(), ^{...});會(huì)導(dǎo)致你等我我等你搀军,結(jié)果導(dǎo)致死鎖膨俐。


18、Object-C有私有方法嗎罩句?私有變量呢焚刺?

1>.OC沒有類似@private的修飾詞來修飾方法,只要寫在.h文件中的止,就是公共方法
2>. 如果你不在.h文件中聲明檩坚,只在.m文件中實(shí)現(xiàn),或在.m文件的Class Extension里聲明诅福,那么基本上和私有方法差不多匾委,可以使用類擴(kuò)展(Extension)來增加私有方法和私有變量
3>. 使用private修飾的全局變量是私有變量


19、關(guān)鍵字const什么含義氓润?

const int a;
int const a;
const int *a;
int const *a;
int * const a;
int const * const a;

1>. 前兩個(gè)的作用是一樣:a 是一個(gè)常整型數(shù)
2>. 第三赂乐、四個(gè)意味著 a 是一個(gè)指向常整型數(shù)的指針(整型數(shù)是不可修改的,但指針可以)
3>. 第五個(gè)的意思:a 是一個(gè)指向整型數(shù)的常指針(指針指向的整型數(shù)是可以修改的咖气,但指針是不可修改的)
4>. 最后一個(gè)意味著:a 是一個(gè)指向常整型數(shù)的常指針(指針指向的整型數(shù)是不可修改的挨措,同時(shí)指針也是不可修改的)


20、用偽代碼寫一個(gè)線程安全的單例模式


static XXManager * instance = nil;
+ (instancetype)shareInstance {
      static dispatch_once_t onceToken;
      dispatch_once(&onceToken, ^{
        instance = [[self alloc] init];
});
return instance;
}

+ (id)allocWithZone:(struct _NSZone *)zone {

      static dispatch_once_t onceToken;
      dispatch_once(&onceToken, ^{
        instance = [super allocWithZone:zone];
});
return instance;
}
- (id)copyWithZone:(NSZone *)zone {
return instance;
}

21崩溪、category(類別) 和 extension(擴(kuò)展) 的區(qū)別

1>. 類別有名字浅役,類擴(kuò)展沒有分類名字,是一種特殊的分類伶唯。
2>. 類別只能擴(kuò)展方法(屬性僅僅是聲明觉既,并沒真正實(shí)現(xiàn)),類擴(kuò)展可以擴(kuò)展屬性乳幸、成員變量和方法瞪讼。
3>. 繼承可以增加,修改或者刪除方法粹断,并且可以增加屬性符欠。


22、tableView的重用機(jī)制瓶埋?

UITableView 通過重用單元格來達(dá)到節(jié)省內(nèi)存的目的: 通過為每個(gè)單元格指定一個(gè)重用標(biāo)識(shí)符希柿,即指定了單元格的種類,當(dāng)屏幕上的單元格滑出屏幕時(shí)诊沪,系統(tǒng)會(huì)把這個(gè)單元格添加到重用隊(duì)列中,等待被重用曾撤,當(dāng)有新單元格從屏幕外滑入屏幕內(nèi)時(shí)娄徊,從重用隊(duì)列中找看有沒有可以重用的單元格,如果有盾戴,就拿過來用寄锐,如果沒有就創(chuàng)建一個(gè)來使用


23、iOS 內(nèi)存的使用和優(yōu)化的注意事項(xiàng)?

重用問題:UITableViewCells尖啡、UICollectionViewCells橄仆、UITableViewHeaderFooterViews。設(shè)置正確的reuseIdentifier衅斩,充分重用
1>不要使用太復(fù)雜的XIB/Storyboard載入時(shí)就會(huì)將XIB/storyboard需要的所有資源盆顾,包括圖片全部載入內(nèi)存。
盡量把views設(shè)置為不透明:當(dāng)opque為NO的時(shí)候畏梆,圖層的半透明取決于圖片和其本身合成的圖層為結(jié)果您宪,可提高性能
選擇正確的數(shù)據(jù)結(jié)構(gòu):學(xué)會(huì)選擇對(duì)業(yè)務(wù)場(chǎng)景最合適的數(shù)組結(jié)構(gòu)是寫出高效代碼的基礎(chǔ)。
gzip/zip壓縮:當(dāng)從服務(wù)端下載相關(guān)附件時(shí)奠涌,可以通過gzip/zip壓縮后再下載宪巨,使得內(nèi)存更小,下載速度也更快溜畅。
延遲加載:對(duì)于不應(yīng)該使用的數(shù)據(jù)捏卓,使用延遲加載方式。對(duì)于不需要馬上顯示的視圖慈格,使用延遲加載方式怠晴。比如,網(wǎng)絡(luò)請(qǐng)求失敗時(shí)顯示的提示界面浴捆,可能一直都不會(huì)使用到蒜田,因此應(yīng)該使用延遲加載。
數(shù)據(jù)緩存:對(duì)于cell的行高要緩存起來选泻,使得reload數(shù)據(jù)時(shí)冲粤,效率也極高。
而對(duì)于那些網(wǎng)絡(luò)數(shù)據(jù)滔金,不需要每次都請(qǐng)求的色解,應(yīng)該緩存起來茂嗓〔鸵穑可以寫入數(shù)據(jù)庫(kù),也可以通過plist文件存儲(chǔ)
處理內(nèi)存警告:一般在基類統(tǒng)一處理內(nèi)存警告述吸,將相關(guān)不用資源立即釋放掉


24忿族、iOS 你在項(xiàng)目中是怎么優(yōu)化內(nèi)存的锣笨?

這個(gè)問題有時(shí)候筆試中也有,有時(shí)候有些面試官會(huì)在面試中問你這個(gè)問題

1>.避免龐大的Xib(Xib比frame消耗更多的CPU資源)
2>.不要阻塞主線程道批,盡量把耗時(shí)的操作放到子線程
3>.重用和延遲加載
4>.盡量減少視圖數(shù)量和層次
5>.優(yōu)化TableView,為了使TableVIew有更好的滾動(dòng)性能可采取以下措施:

  • 正確使用ruseIdentifier來重用cells
  • 采用懶加載即延遲加載的方式加載cell上的控件
  • 當(dāng)TableView滑動(dòng)的時(shí)候不加載
  • 緩存cell的高度错英。在呈現(xiàn)cell前,把cell的高度計(jì)算好緩存起來隆豹,避免每次加載cell的時(shí)候都要計(jì)算
  • 盡量使用不透明的UI控件

25椭岩、寫一個(gè)完整的代理,包括聲明璃赡、實(shí)現(xiàn)


// 創(chuàng)建
@protocol PersonDelagate
@required
-(void)eat:(NSString *)foodName;
@optional
-(void)run;
@end

// 聲明 .h
@interface Person: NSObject<PersonDelagate>
@end

// 實(shí)現(xiàn) .m
@implementation Person

- (void)eat:(NSString *)foodName {
NSLog(@"吃:%@", foodName);
}

- (void)run {
   NSLog(@"run");
}
@end

26判哥、iOS 你在項(xiàng)目中用過 GCD 嗎?舉個(gè)例子

用過碉考。比如 網(wǎng)絡(luò)請(qǐng)求數(shù)據(jù)成功之后刷新列表

   [HTTPRequest POST:kbazaarUrl parameter:nil success:^(id resposeObject) { 
       /**網(wǎng)絡(luò)請(qǐng)求成功之后處理數(shù)據(jù)*/
        if (Success) {
              //處理數(shù)據(jù) ... 
            }
            dispatch_async(dispatch_get_main_queue(), ^{
                [weakSelf.tableView reloadData];  
            });
        }else{
            [weakSelf failEndRefreshStatus:0];
            [MBProgressHUD LY_ShowError:resposeObject[@"msg"] time:2.0];
        }
    } failure:^(NSError *error) {
        [MBProgressHUD LY_ShowError:kNoNetworkTips time:2.0];
    }];


27塌计、GCD 與 NSOperation 的區(qū)別

NSOperation:相對(duì)于GCD來說,更加強(qiáng)大侯谁⌒拷觯可以給operation之間添加依賴關(guān)系、取消一個(gè)正在執(zhí)行的operation墙贱、暫停和恢復(fù)operationQueue等

GCD: 是一種更輕量級(jí)的热芹,以FIFO(先進(jìn)先出,后進(jìn)后出)的順序執(zhí)行并發(fā)任務(wù)惨撇。使用GCD我們并不用關(guān)心任務(wù)的調(diào)度情況剿吻,而是系統(tǒng)會(huì)自動(dòng)幫我們處理。但是GCD的短板也是非常明顯的串纺,比如我們想要給任務(wù)之間添加依賴關(guān)系丽旅、取消或者暫停一個(gè)正在執(zhí)行的任務(wù)時(shí)就會(huì)變得束手無策。


28纺棺、寫出使用GCD方式從子線程回到主線程的方法代碼

dispatch_sync(dispatch_get_main_queue(), ^{ });

29榄笙、OC中創(chuàng)建線程的方法是什么?如果在主線程中執(zhí)行代碼茅撞,方法是什么糊啡?

// 創(chuàng)建線程的方法

- [NSThread detachNewThreadSelector:nil toTarget:nil withObject:nil]

- [self performSelectorInBackground:nil withObject:nil];

- [[NSThread alloc] initWithTarget:nil selector:nil object:nil];

- dispatch_async(dispatch_get_global_queue(0, 0), ^{});

- [[NSOperationQueue new] addOperation:nil];

// 主線程中執(zhí)行代碼的方法

- [self performSelectorOnMainThread:nil withObject:nil waitUntilDone:YES];

- dispatch_async(dispatch_get_main_queue(), ^{});

- [[NSOperationQueue mainQueue] addOperation:nil];

30稍算、你是怎么封裝一個(gè)view的

筆者就曾遇到過這個(gè)問題钾埂。當(dāng)時(shí)這樣绳军,原題目是:怎么用純代碼或者xib實(shí)現(xiàn)一個(gè)View的組件化多柑〕踵冢看到這個(gè)題目的時(shí)候我就懵逼了驻龟,就好像考試的過程中碰到不會(huì)的題目一樣类溢,這里直接是0分。后來面試的過程中谴蔑,我就用面試官此題怎解豌骏。霹靂嘩啦給我說了一大堆,最后我問是不是封裝一個(gè)View?他回答說:是的! 封裝任意一個(gè)View.之后就問我實(shí)現(xiàn)思路要實(shí)現(xiàn)什么方法隐锭。然后我就說實(shí)現(xiàn)initWIthFrame:然后創(chuàng)建需要的控件窃躲,最后直接通過添加個(gè)類方法show出來即可。因?yàn)槲乙膊恢肋@個(gè)任意的View到底是個(gè)什么View钦睡,就將TA假象成一個(gè)彈框好了蒂窒。結(jié)果面試官繼續(xù)追問過好幾次還要實(shí)現(xiàn)什么方法呢?荞怒?洒琢? 我沉思了好久好一會(huì)(明明就差不多是這樣子左右,為啥他還繼續(xù)追問呢)褐桌。衰抑。。面試官可能感受到了空中傳來一陣尷尬氣氛之后荧嵌,說不知道沒關(guān)系呛踊。。啦撮。之后又問了一個(gè)類似QQ消息點(diǎn)擊tabBar上面的item然后列表的小紅點(diǎn)有類似西紅柿爆炸的效果谭网。經(jīng)過上一個(gè)騷問題,我已經(jīng)知道面試已經(jīng)涼涼了(而且聽說接手的項(xiàng)目是之前廢棄半年的棋牌項(xiàng)目,現(xiàn)在重新啟動(dòng)) 我直接說不知道赃春。對(duì)于此面試官來說愉择,我可能是個(gè)菜雞吧。我覺得身心受到了嚴(yán)重的打擊织中∽短椋可能還是不夠努力吧!

1>. 可以通過純代碼或者xib的方式來封裝子控件
2>. 建立一個(gè)跟view相關(guān)的模型狭吼,然后將模型數(shù)據(jù)傳給view站楚,通過模型上的數(shù)據(jù)給view的子控件賦值

- (instancetype)initWithFrame:(CGRect)frame {

  if(self = [super initWithFrame:frame]) {

          [self setupUI];
 }
return self;

}
/*** 通過xib初始化控件時(shí)一定會(huì)走這個(gè)方法*/

- (id)initWithCoder:(NSCoder *)aDecoder {

    if(self = [super initWithCoder:aDecoder]) {
        [self setupUI];
}

return self;

}

- (void)setupUI {
// 初始化代碼
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市搏嗡,隨后出現(xiàn)的幾起案子窿春,更是在濱河造成了極大的恐慌,老刑警劉巖采盒,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旧乞,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡磅氨,警方通過查閱死者的電腦和手機(jī)尺栖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烦租,“玉大人延赌,你說我怎么就攤上這事除盏。” “怎么了挫以?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵者蠕,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我掐松,道長(zhǎng)踱侣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任大磺,我火速辦了婚禮抡句,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘杠愧。我一直安慰自己待榔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布流济。 她就那樣靜靜地躺著究抓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪袭灯。 梳的紋絲不亂的頭發(fā)上刺下,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音稽荧,去河邊找鬼橘茉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛姨丈,可吹牛的內(nèi)容都是我干的畅卓。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼蟋恬,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼翁潘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起歼争,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤拜马,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后沐绒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俩莽,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年乔遮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扮超。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖出刷,靈堂內(nèi)的尸體忽然破棺而出璧疗,到底是詐尸還是另有隱情,我是刑警寧澤馁龟,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布崩侠,位于F島的核電站,受9級(jí)特大地震影響屁柏,放射性物質(zhì)發(fā)生泄漏啦膜。R本人自食惡果不足惜有送,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一淌喻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧雀摘,春花似錦裸删、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至清蚀,卻和暖如春匕荸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背枷邪。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工榛搔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人东揣。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓践惑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親嘶卧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子尔觉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348