iOS最新面試題匯總:
iOS最新面試題匯總(一)
iOS最新面試題匯總(二)
iOS最新面試題匯總(三)
iOS最新面試題匯總(四)
1. 設(shè)計(jì)模式是什么? 你知道哪些設(shè)計(jì)模式柠掂,并簡(jiǎn)要敘述横堡?
設(shè)計(jì)模式是一種編碼經(jīng)驗(yàn)冀泻,就是用比較成熟的邏輯去處理某一種類型的事情。
1). MVC模式:Model View Control,把模型 視圖 控制器 層進(jìn)行解耦合編寫(xiě)耘柱。
2). MVVM模式:Model View ViewModel 把模型 視圖 業(yè)務(wù)邏輯 層進(jìn)行解耦和編寫(xiě)。
3). 單例模式:通過(guò)static關(guān)鍵詞棍现,聲明全局變量。在整個(gè)進(jìn)程運(yùn)行期間只會(huì)被賦值一次镜遣。
4). 觀察者模式:KVO是典型的通知模式己肮,觀察某個(gè)屬性的狀態(tài),狀態(tài)發(fā)生變化時(shí)通知觀察者悲关。
5). 委托模式:代理+協(xié)議的組合谎僻。實(shí)現(xiàn)1對(duì)1的反向傳值操作。
6). 工廠模式:通過(guò)一個(gè)類方法寓辱,批量的根據(jù)已有模板生產(chǎn)對(duì)象艘绍。
2. MVC 和 MVVM 的區(qū)別
1). MVVM是對(duì)胖模型進(jìn)行的拆分,其本質(zhì)是給控制器減負(fù)秫筏,將一些弱業(yè)務(wù)邏輯放到VM中去處理诱鞠。
2). MVC是一切設(shè)計(jì)的基礎(chǔ),所有新的設(shè)計(jì)模式都是基于MVC進(jìn)行的改進(jì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<>用來(lái)包含系統(tǒng)的頭文件隆夯,#import””用來(lái)包含用戶頭文件彻亲。
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是什么宙址?重寫(xiě)一個(gè)類的方式用繼承好還是分類好?為什么调卑?
答:Objective-C的類不可以多重繼承抡砂;可以實(shí)現(xiàn)多個(gè)接口(協(xié)議)大咱;Category是類別;一般情況用分類好注益,用Category去重寫(xiě)類的方法碴巾,僅對(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í)例變量一般通過(guò)“存取方法”(access method)來(lái)訪問(wèn)郑诺。其中夹姥,“獲取方法” (getter)用于讀取變量值,而“設(shè)置方法” (setter)用于寫(xiě)入變量值辙诞。
7.@property中有哪些屬性關(guān)鍵字佃声?/ @property 后面可以有哪些修飾符?
屬性可以擁有的特質(zhì)分為四類:
1.原子性--- nonatomic 特質(zhì)
2.讀/寫(xiě)權(quán)限---readwrite(讀寫(xiě))倘要、readonly (只讀)
3.內(nèi)存管理語(yǔ)義---assign圾亏、strong、 weak封拧、unsafe_unretained志鹃、copy
4.方法名---getter=<name> 、setter=<name>
5.不常用的:nonnull,null_resettable,nullable
屬性關(guān)鍵字
8.readwrite泽西,readonly曹铃,assign,retain捧杉,copy陕见,nonatomic 各是什么作用,在那種情況下用味抖?
答:
1). readwrite 是可讀可寫(xiě)特性评甜。需要生成getter方法和setter方法。
2). readonly 是只讀特性仔涩。只會(huì)生成getter方法忍坷,不會(huì)生成setter方法,不希望屬性在類外改變。
3). assign 是賦值特性佩研。setter方法將傳入?yún)?shù)賦值給實(shí)例變量;僅設(shè)置變量時(shí),assign用于基本數(shù)據(jù)類型柑肴。
4). retain(MRC)/strong(ARC) 表示持有特性。setter方法將傳入?yún)?shù)先保留旬薯,再賦值晰骑,傳入?yún)?shù)的retaincount會(huì)+1。
5). copy 表示拷貝特性绊序。setter方法將傳入對(duì)象復(fù)制一份硕舆,需要完全一份新的變量時(shí)。
6). nonatomic 非原子操作政模。決定編譯器生成的setter和getter方法是否是原子操作,atomic表示多線程安全蚂会,一般使用nonatomic淋样,效率高。
9. 什么情況使用 weak 關(guān)鍵字胁住,相比 assign 有什么不同趁猴?
1.在 ARC 中,在有可能出現(xiàn)循環(huán)引用的時(shí)候,往往要通過(guò)讓其中一端使用 weak 來(lái)解決,比如: delegate 代理屬性。
2.自身已經(jīng)對(duì)它進(jìn)行一次強(qiáng)引用,沒(méi)有必要再?gòu)?qiáng)引用一次,此時(shí)也會(huì)使用 weak,自定義 IBOutlet 控件屬性一般也使用 weak彪见;當(dāng)然儡司,也可以使用strong。
IBOutlet連出來(lái)的視圖屬性為什么可以被設(shè)置成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. 怎么用 copy 關(guān)鍵字垢粮?
用途:
- NSString、NSArray靠粪、NSDictionary 等等經(jīng)常使用copy關(guān)鍵字蜡吧,是因?yàn)樗麄冇袑?duì)應(yīng)的可變類型:NSMutableString、NSMutableArray占键、NSMutableDictionary昔善;
- block 也經(jīng)常使用 copy 關(guān)鍵字。
說(shuō)明:
block 使用 copy 是從 MRC 遺留下來(lái)的“傳統(tǒng)”,在 MRC 中,方法內(nèi)部的 block 是在棧區(qū)的,使用 copy 可以把它放到堆區(qū).在 ARC 中寫(xiě)不寫(xiě)都行:對(duì)于 block 使用 copy 還是 strong 效果是一樣的畔乙,但寫(xiě)上 copy 也無(wú)傷大雅耀鸦,還能時(shí)刻提醒我們:編譯器自動(dòng)對(duì) block 進(jìn)行了 copy 操作。如果不寫(xiě) copy ,該類的調(diào)用者有可能會(huì)忘記或者根本不知道“編譯器會(huì)自動(dòng)對(duì) block 進(jìn)行了 copy 操作”袖订,他們有可能會(huì)在調(diào)用之前自行拷貝屬性值氮帐。這種操作多余而低效。
11. 用@property聲明的 NSString / NSArray / NSDictionary 經(jīng)常使用 copy 關(guān)鍵字洛姑,為什么上沐?如果改用strong關(guān)鍵字,可能造成什么問(wèn)題楞艾?
答:用 @property 聲明 NSString参咙、NSArray、NSDictionary 經(jīng)常使用 copy 關(guān)鍵字硫眯,是因?yàn)樗麄冇袑?duì)應(yīng)的可變類型:NSMutableString蕴侧、NSMutableArray、NSMutableDictionary两入,他們之間可能進(jìn)行賦值操作(就是把可變的賦值給不可變的)净宵,為確保對(duì)象中的字符串值不會(huì)無(wú)意間變動(dòng),應(yīng)該在設(shè)置新屬性值時(shí)拷貝一份裹纳。
- 因?yàn)楦割愔羔樋梢灾赶蜃宇悓?duì)象,使用 copy 的目的是為了讓本對(duì)象的屬性不受外界影響,使用 copy 無(wú)論給我傳入是一個(gè)可變對(duì)象還是不可對(duì)象,我本身持有的就是一個(gè)不可變的副本择葡。
- 如果我們使用是 strong ,那么這個(gè)屬性就有可能指向一個(gè)可變對(duì)象,如果這個(gè)可變對(duì)象在外部被修改了,那么會(huì)影響該屬性。
- 總結(jié):使用copy的目的是剃氧,防止把可變類型的對(duì)象賦值給不可變類型的對(duì)象時(shí)敏储,可變類型對(duì)象的值發(fā)送變化會(huì)無(wú)意間篡改不可變類型對(duì)象原來(lái)的值。
12. 淺拷貝和深拷貝的區(qū)別朋鞍?
答:
淺拷貝:只復(fù)制指向?qū)ο蟮闹羔樢烟恚粡?fù)制引用對(duì)象本身。
深拷貝:復(fù)制引用對(duì)象本身滥酥。內(nèi)存中存在了兩份獨(dú)立對(duì)象本身酝碳,當(dāng)修改A時(shí),A_copy不變恨狈。
13.系統(tǒng)對(duì)象的 copy 與 mutableCopy 方法
不管是集合類對(duì)象(NSArray疏哗、NSDictionary、NSSet ... 之類的對(duì)象)禾怠,還是非集合類對(duì)象(NSString, NSNumber ... 之類的對(duì)象)返奉,接收到copy和mutableCopy消息時(shí),都遵循以下準(zhǔn)則:
- copy 返回的是不可變對(duì)象(immutableObject)吗氏;如果用copy返回值調(diào)用mutable對(duì)象的方法就會(huì)crash芽偏。
- mutableCopy 返回的是可變對(duì)象(mutableObject)。
一弦讽、非集合類對(duì)象的copy與mutableCopy
在非集合類對(duì)象中污尉,對(duì)不可變對(duì)象進(jìn)行copy操作膀哲,是指針復(fù)制,mutableCopy操作是內(nèi)容復(fù)制被碗;
對(duì)可變對(duì)象進(jìn)行copy和mutableCopy都是內(nèi)容復(fù)制某宪。用代碼簡(jiǎn)單表示如下:
NSString *str = @"hello word!";
NSString *strCopy = [str copy] // 指針復(fù)制,strCopy與str的地址一樣
NSMutableString *strMCopy = [str mutableCopy] // 內(nèi)容復(fù)制锐朴,strMCopy與str的地址不一樣
NSMutableString *mutableStr = [NSMutableString stringWithString: @"hello word!"];
NSString *strCopy = [mutableStr copy] // 內(nèi)容復(fù)制
NSMutableString *strMCopy = [mutableStr mutableCopy] // 內(nèi)容復(fù)制
二兴喂、集合類對(duì)象的copy與mutableCopy (同上)
在集合類對(duì)象中,對(duì)不可變對(duì)象進(jìn)行copy操作焚志,是指針復(fù)制衣迷,mutableCopy操作是內(nèi)容復(fù)制;
對(duì)可變對(duì)象進(jìn)行copy和mutableCopy都是內(nèi)容復(fù)制酱酬。但是:集合對(duì)象的內(nèi)容復(fù)制僅限于對(duì)象本身壶谒,對(duì)集合內(nèi)的對(duì)象元素仍然是指針復(fù)制。(即單層內(nèi)容復(fù)制)
NSArray *arr = @[@[@"a", @"b"], @[@"c", @"d"];
NSArray *copyArr = [arr copy]; // 指針復(fù)制
NSMutableArray *mCopyArr = [arr mutableCopy]; //單層內(nèi)容復(fù)制
NSMutableArray *array = [NSMutableArray arrayWithObjects:[NSMutableString stringWithString:@"a"],@"b",@"c",nil];
NSArray *copyArr = [mutableArr copy]; // 單層內(nèi)容復(fù)制
NSMutableArray *mCopyArr = [mutableArr mutableCopy]; // 單層內(nèi)容復(fù)制
【總結(jié)一句話】:
只有對(duì)不可變對(duì)象進(jìn)行copy操作是指針復(fù)制(淺復(fù)制)膳沽,其它情況都是內(nèi)容復(fù)制(深復(fù)制)汗菜!
14.這個(gè)寫(xiě)法會(huì)出什么問(wèn)題:@property (nonatomic, copy) NSMutableArray *arr;
問(wèn)題:添加,刪除,修改數(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ì)象的方法)
原因:是因?yàn)?copy 就是復(fù)制一個(gè)不可變 NSArray 的對(duì)象呵俏,不能對(duì) NSArray 對(duì)象進(jìn)行添加/修改堆缘。
15. 如何讓自己的類用 copy 修飾符滔灶?如何重寫(xiě)帶 copy 關(guān)鍵字的 setter?
若想令自己所寫(xiě)的對(duì)象具有拷貝功能吼肥,則需實(shí)現(xiàn) NSCopying 協(xié)議录平。如果自定義的對(duì)象分為可變版本與不可變版本,那么就要同時(shí)實(shí)現(xiàn) NSCopying 與 NSMutableCopying 協(xié)議缀皱。
具體步驟:
- 需聲明該類遵從 NSCopying 協(xié)議
- 實(shí)現(xiàn) NSCopying 協(xié)議的方法斗这。
// 該協(xié)議只有一個(gè)方法: - (id)copyWithZone:(NSZone *)zone;
// 注意:使用 copy 修飾符,調(diào)用的是copy方法啤斗,其實(shí)真正需要實(shí)現(xiàn)的是 “copyWithZone” 方法表箭。
16.寫(xiě)一個(gè) setter 方法用于完成 @property (nonatomic, retain) NSString *name,寫(xiě)一個(gè) setter 方法用于完成 @property (nonatomic, copy) NSString *name
答:
// retain
-(void)setName:(NSArray *)name
{
if (_name !=name) {
[_name release];
_name =[name retain];
}
}
// copy
-(void)setName:(NSString *)name
{
if (_name !=name) {
[_name release];
_name = [name copy];
}
}
17. @synthesize 和 @dynamic 分別有什么作用钮莲?
@property有兩個(gè)對(duì)應(yīng)的詞免钻,一個(gè)是@synthesize(合成實(shí)例變量),一個(gè)是@dynamic崔拥。
如果@synthesize和@dynamic都沒(méi)有寫(xiě)极舔,那么默認(rèn)的就是 @synthesize var = _var;
// 在類的實(shí)現(xiàn)代碼里通過(guò) @synthesize 語(yǔ)法可以來(lái)指定實(shí)例變量的名字。(@synthesize var = _newVar;)
- @synthesize 的語(yǔ)義是如果你沒(méi)有手動(dòng)實(shí)現(xiàn)setter方法和getter方法链瓦,那么編譯器會(huì)自動(dòng)為你加上這兩個(gè)方法拆魏。
- @dynamic 告訴編譯器,屬性的setter與getter方法由用戶自己實(shí)現(xiàn),不自動(dòng)生成(如渤刃,@dynamic var)拥峦。
18.常見(jiàn)的 Objective-C 的數(shù)據(jù)類型有那些,和C的基本數(shù)據(jù)類型有什么區(qū)別溪掀?如:NSInteger和int
答:
Objective-C的數(shù)據(jù)類型有NSString事镣,NSNumber,NSArray揪胃,NSMutableArray璃哟,NSData等等,這些都是class喊递,創(chuàng)建后便是對(duì)象随闪,而C語(yǔ)言的基本數(shù)據(jù)類型int,只是一定字節(jié)的內(nèi)存空間骚勘,用于存放數(shù)值;NSInteger是基本數(shù)據(jù)類型铐伴,并不是NSNumber的子類,當(dāng)然也不是NSObject的子類俏讹。NSInteger是基本數(shù)據(jù)類型Int或者Long的別名(NSInteger的定義typedef long NSInteger)当宴,它的區(qū)別在于,NSInteger會(huì)根據(jù)系統(tǒng)是32位還是64位來(lái)決定是本身是int還是long泽疆。
19.id 聲明的對(duì)象有什么特性户矢?
答:id 聲明的對(duì)象具有運(yùn)行時(shí)的特性,即可以指向任意類型的Objcetive-C的對(duì)象殉疼。
20.Objective-C 如何對(duì)內(nèi)存管理的梯浪,說(shuō)說(shuō)你的看法和解決方法?
答: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)存誰(shuí)申請(qǐng)、誰(shuí)釋放褒颈;誰(shuí)添加柒巫,誰(shuí)釋放的原則。
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ī)制影響布疼。
聯(lián)系
github地址:https://github.com/meetly
希望大家多多指教摊趾!