iOS面試題及答案
#import跟 #include 有什么區(qū)別,@class呢佑吝,#import<> 跟 #import””有什么區(qū)別?
1).#import是Objective-C導入頭文件的關鍵字,#include是C/C++導入頭文件的關鍵字蔼卡,使用#import頭文件會自動只導入一次屯伞,不會重復導入腿箩。
2).@class告訴編譯器某個類的聲明,當執(zhí)行時劣摇,才去查看類的實現(xiàn)文件珠移,可以解決頭文件的相互包含。3).#import<>用來包含系統(tǒng)的頭文件末融,#import””用來包含用戶頭文件钧惧。
什么情況使用 weak 關鍵字,相比 assign 有什么不同滑潘?
1.在 ARC 中,在有可能出現(xiàn)循環(huán)引用的時候,往往要通過讓其中一端使用weak來解決,比如: delegate 代理屬性垢乙。
2.自身已經(jīng)對它進行一次強引用,沒有必要再強引用一次,此時也會使用weak,自定義IBOutlet控件屬性一般也使用weak;當然语卤,也可以使用strong追逮。IBOutlet連出來的視圖屬性為什么可以被設置成weak? 因為父控件的subViews數(shù)組已經(jīng)對它有一個強引用。
不同點:assign可以用基本數(shù)據(jù)類型 和?OC對象粹舵,而weak必須用于 OC對象钮孵。weak表明該屬性定義了一種“非擁有關系”。在屬性所指的對象銷毀時眼滤,屬性值會自動清空(nil)巴席。
1) 都不是強指針(不是強引用),不能保住對象的命
2) weak生成的成員變量是用__weak修飾的 : 所指向的對象銷毀后诅需,會自動變成nil指針(空指針)漾唉,不再指向已經(jīng)銷毀的對象
3) assign生成的成員變量是用__unsafe_unretained修飾的 : 所指向的對象銷毀后,仍舊指向已經(jīng)銷毀的對象
用@property聲明的 NSString / NSArray / NSDictionary 經(jīng)常使用 copy 關鍵字堰塌,為什么赵刑?如果改用strong關鍵字,可能造成什么問題场刑?
用@property聲明NSString般此、NSArray、NSDictionary經(jīng)常使用copy關鍵字,是因為他們有對應的可變類型:NSMutableString铐懊、NSMutableArray邀桑、NSMutableDictionary,他們之間可能進行賦值操作(就是把可變的賦值給不可變的)科乎,為確保對象中的字符串值不會無意間變動壁畸,應該在設置新屬性值時拷貝一份。
1.因為父類指針可以指向子類對象,使用copy的目的是為了讓本對象的屬性不受外界影響,使用copy無論給我傳入是一個可變對象還是不可對象,我本身持有的就是一個不可變的副本喜喂。
2.如果我們使用是strong,那么這個屬性就有可能指向一個可變對象,如果這個可變對象在外部被修改了,那么會影響該屬性瓤摧。
//總結:使用copy的目的是,防止把可變類型的對象賦值給不可變類型的對象時玉吁,可變類型對象的值發(fā)送變化會無意間篡改不可變類型對象原來的值照弥。
淺拷貝:只復制指向對象的指針,而不復制引用對象本身进副。
深拷貝:復制引用對象本身这揣。內存中存在了兩份獨立對象本身,當修改A時影斑,A_copy不變给赞。
【總結一句話】: 只有對不可變對象進行copy操作是指針復制(淺復制),其它情況都是內容復制(深復制)矫户!
@synthesize 和 @dynamic 分別有什么作用片迅?
@property有兩個對應的詞,一個是@synthesize(合成實例變量)皆辽,一個是@dynamic柑蛇。如果@synthesize和@dynamic都沒有寫,那么默認的就是@synthesizevar = _var;// 在類的實現(xiàn)代碼里通過 @synthesize 語法可以來指定實例變量的名字驱闷。(@synthesize var = _newVar;)
1.@synthesize的語義是如果你沒有手動實現(xiàn)setter方法和getter方法耻台,那么編譯器會自動為你加上這兩個方法。2.@dynamic告訴編譯器空另,屬性的setter與getter方法由用戶自己實現(xiàn)盆耽,不自動生成(如,@dynamicvar)扼菠。
類別的作用?繼承和類別在實現(xiàn)中有何區(qū)別?
category 可以在不獲悉摄杂,不改變原來代碼的情況下往里面添加新的方法,只能添加循榆,不能刪除修改匙姜,并且如果類別和原來類中的方法產(chǎn)生名稱沖突,則類別將覆蓋原來的方法冯痢,因為類別具有更高的優(yōu)先級。
類別主要有3個作用:
1).將類的實現(xiàn)分散到多個不同文件或多個不同框架中。
2).創(chuàng)建對私有方法的前向引用浦楣。
3).向對象添加非正式協(xié)議袖肥。
繼承可以增加,修改或者刪除方法振劳,并且可以增加屬性椎组。