在這遍搞,小編為各位搜羅了一些經(jīng)典面試題罗侯,一起去看看吧!
純干貨溪猿、不羅嗦歇父!
看不看由你,
錯過別躺淚
1.Object-C有多繼承嗎再愈?沒有的話用什么代替榜苫?
cocoa 中所有的類都是NSObject 的子類,多繼承在這里是用protocol 委托代理來實現(xiàn)的
你不用去考慮繁瑣的多繼承 ,虛基類的概念.ood的多態(tài)特性
在 obj-c 中通過委托來實現(xiàn).
2.Object-C有私有方法嗎翎冲?私有變量呢垂睬?
objective-c – 類里面的方法只有兩種, 靜態(tài)方法和實例方法. 這似乎就不是完整的面向?qū)ο罅?按照OO的原則就是一個對象只暴露有用的東西. 如果沒有了私有方法的話, 對于一些小范圍的代碼重用就不那么順手了. 在類里面聲名一個私有方法
@interface Controller : NSObject { NSString *something; }
+ (void)thisIsAStaticMethod;
– (void)thisIsAnInstanceMethod;
@end
@interface Controller (private) -
(void)thisIsAPrivateMethod;
@end
@private可以用來修飾私有變量
在Objective‐C中,所有實例變量默認(rèn)都是私有的,所有實例方法默認(rèn)都是公有的涂圆。
3.線程和進程的區(qū)別祠乃?
進程和線程都是由操作系統(tǒng)所體會的程序運行的基本單元,系統(tǒng)利用該基本單元實現(xiàn)系統(tǒng)對應(yīng)用的并發(fā)性赏壹。
進程和線程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式。進程有獨立的地址空間衔沼,一個進程崩潰后蝌借,在保護模式下不會對其它進程產(chǎn)生影響,而線程只是一個進程中的不同執(zhí)行路徑指蚁。線程有自己的堆棧和局部變量菩佑,但線程之間沒有單獨的地址空間,一個線程死掉就等于整個進程死掉凝化,所以多進程的程序要比多線程的程序健壯稍坯,但在進程切換時,耗費資源較大搓劫,效率要差一些瞧哟。但對于一些要求同時進行并且又要共享某些變量的并發(fā)操作,只能用線程枪向,不能用進程勤揩。
4.堆和棧的區(qū)別?
管理方式:對于棧來講遣疯,是由編譯器自動管理雄可,無需我們手工控制凿傅;對于堆來說,釋放工作由程序員控制数苫,容易產(chǎn)生memory leak聪舒。
申請大小:
棧:在Windows下,棧是向低地址擴展的數(shù)據(jù)結(jié)構(gòu)虐急,是一塊連續(xù)的內(nèi)存的區(qū)域箱残。這句話的意思是棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的,在WINDOWS下止吁,棧的大小是2M(也有的說是1M被辑,總之是一個編譯時就確定的常數(shù)),如果申請的空間超過棧的剩余空間時敬惦,將提示overflow盼理。因此,能從棧獲得的空間較小俄删。
堆:堆是向高地址擴展的數(shù)據(jù)結(jié)構(gòu)宏怔,是不連續(xù)的內(nèi)存區(qū)域。這是由于系統(tǒng)是用鏈表來存儲的空閑內(nèi)存地址的畴椰,自然是不連續(xù)的臊诊,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計算機系統(tǒng)中有效的虛擬內(nèi)存斜脂。由此可見抓艳,堆獲得的空間比較靈活,也比較大帚戳。
碎片問題:對于堆來講玷或,頻繁的new/delete勢必會造成內(nèi)存空間的不連續(xù),從而造成大量的碎片销斟,使程序效率降低庐椒。對于棧來講,則不會存在這個問題蚂踊,因為棧是先進后出的隊列,他們是如此的一一對應(yīng)笔宿,以至于永遠都不可能有一個內(nèi)存塊從棧中間彈出
分配方式:堆都是動態(tài)分配的犁钟,沒有靜態(tài)分配的堆。棧有2種分配方式:靜態(tài)分配和動態(tài)分配泼橘。靜態(tài)分配是編譯器完成的涝动,比如局部變量的分配。動態(tài)分配由alloca函數(shù)進行分配炬灭,但是棧的動態(tài)分配和堆是不同的醋粟,他的動態(tài)分配是由編譯器進行釋放,無需我們手工實現(xiàn)。
分配效率:棧是機器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu)米愿,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址厦凤,壓棧出棧都有專門的指令執(zhí)行,這就決定了棧的效率比較高育苟。堆則是C/C++函數(shù)庫提供的较鼓,它的機制是很復(fù)雜的。
5.Object-C的內(nèi)存管理违柏?
當(dāng)你使用new,alloc和copy方法創(chuàng)建一個對象時,該對象的保留計數(shù)器值為1.當(dāng)你不再使用該對象時,你要負責(zé)向該對象發(fā)送一條release或autorelease消息.這樣,該對象將在使用壽命結(jié)束時被銷毀.
當(dāng)你通過任何其他方法獲得一個對象時,則假設(shè)該對象的保留計數(shù)器值為1,而且已經(jīng)被設(shè)置為自動釋放,你不需要執(zhí)行任何操作來確保該對象被清理.如果你打算在一段時間內(nèi)擁有該對象,則需要保留它并確保在操作完成時釋放它.
如果你保留了某個對象,你需要(最終)釋放或自動釋放該對象.必須保持retain方法和release方法的使用次數(shù)相等.
6.為什么很多內(nèi)置的類博烂,如TableViewController的delegate的屬性是assign不是retain?
循環(huán)引用
所有的引用計數(shù)系統(tǒng)漱竖,都存在循環(huán)應(yīng)用的問題禽篱。
例如下面的引用關(guān)系:
· 對象a創(chuàng)建并引用到了對象b.
· 對象b創(chuàng)建并引用到了對象c.
· 對象c創(chuàng)建并引用到了對象b.
這時候b和c的引用計數(shù)分別是2和1。當(dāng)a不再使用b馍惹,調(diào)用release釋放對b的所有權(quán)谆级,因為c還引用了b,所以b的引用計數(shù)為1讼积,b不會被釋放肥照。b不釋放,c的引用計數(shù)就是1勤众,c也不會被釋放舆绎。從此,b和c永遠留在內(nèi)存中们颜。
這種情況吕朵,必須打斷循環(huán)引用,通過其他規(guī)則來維護引用關(guān)系窥突。比如努溃,我們常見的delegate往往是assign方式的屬性而不是retain方式的屬性,賦值不會增加引用計數(shù)阻问,就是為了防止delegation兩端產(chǎn)生不必要的循環(huán)引用梧税。如果一個UITableViewController 對象a通過retain獲取了UITableView對象b的所有權(quán),這個UITableView對象b的delegate又是a称近,
如果這個delegate是retain方式的第队,那基本上就沒有機會釋放這兩個對象了。自己在設(shè)計使用delegate模式時刨秆,也要注意這點凳谦。
7.定義屬性時,什么情況使用copy衡未、assign尸执、retain家凯?
assign用于簡單數(shù)據(jù)類型,如NSInteger,double,bool,
retain和copy用于對象如失,
copy用于當(dāng)a指向一個對象绊诲,b也想指向同樣的對象的時候,如果用assign岖常,a如果釋放驯镊,再調(diào)用b會crash,如果用copy 的方式,a和b各自有自己的內(nèi)存竭鞍,就可以解決這個問題板惑。
retain 會使計數(shù)器加一,也可以解決assign的問題偎快。
另外:atomic和nonatomic用來決定編譯器生成的getter和setter是否為原子操作冯乘。在多線程環(huán)境下,原子操作是必要的晒夹,否則有可能引起錯誤的結(jié)果裆馒。
加了atomic,setter函數(shù)會變成下面這樣:
if (property != newValue) {
[property release];
property = [newValue retain];
}
8.對象是什么時候被release的丐怯?
引用計數(shù)為0時喷好。
autorelease實際上只是把對release的調(diào)用延遲了,對于每一個Autorelease读跷,系統(tǒng)只是把該Object放入了當(dāng)前的Autorelease pool中梗搅,當(dāng)該pool被釋放時,該pool中的所有Object會被調(diào)用Release效览。對于每一個Runloop无切,
系統(tǒng)會隱式創(chuàng)建一個Autorelease pool,這樣所有的release pool會構(gòu)成一個象CallStack一樣的一個棧式結(jié)構(gòu)丐枉,在每一個Runloop結(jié)束時哆键,當(dāng)前棧頂?shù)腁utorelease pool會被銷毀,這樣這個pool里的每個Object(就是autorelease的對象)會被release瘦锹。
9.那什么是一個Runloop呢?
一個UI事件沼本,Timer call抽兆, delegate call,
都會是一個新的Runloop
10.iOS有沒有垃圾回收族淮?
Objective-C 2.0也是有垃圾回收機制的辫红,但是只能在Mac OS X Leopard 10.5 以上的版本使用。
11.tableView的重用機制切油?
查看UITableView頭文件,會找到NSMutableArray* visiableCells名惩,和NSMutableDictnery* reusableTableCells兩個結(jié)構(gòu)澎胡。visiableCells內(nèi)保存當(dāng)前顯示的cells娩鹉,reusableTableCells保存可重用的cells。
TableView顯示之初戚宦,reusableTableCells為空锈嫩,那么tableView dequeueReusableCellWithIdentifier:CellIdentifier返回nil。開始的cell都是通過[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]來創(chuàng)建艳汽,而且cellForRowAtIndexPath只是調(diào)用最大顯示cell數(shù)的次數(shù)对雪。
比如:有100條數(shù)據(jù),iPhone一屏最多顯示10個cell甚牲。程序最開始顯示TableView的情況是:
1.用[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]創(chuàng)建10次cell蝶柿,并給cell指定同樣的重用標(biāo)識(當(dāng)然交汤,可以為不同顯示類型的cell指定不同的標(biāo)識)。并且10個cell全部都加入到visiableCells數(shù)組芙扎,reusableTableCells為空戒洼。
2. 向下拖動tableView俏橘,當(dāng)cell1完全移出屏幕,并且cell11(它也是alloc出來的寥掐,原因同上)完全顯示出來的時候召耘。cell11加入到visiableCells,cell1移出visiableCells剖踊,cell1加入到reusableTableCells衫贬。
3. 接著向下拖動tableView,因為reusableTableCells中已經(jīng)有值圃验,所以缝呕,當(dāng)需要顯示新的cell供常,cellForRowAtIndexPath再次被調(diào)用的時候,tableView dequeueReusableCellWithIdentifier:CellIdentifier麻裁,返回cell1源祈。cell1加入到visiableCells,cell1移出reusableTableCells手销;cell2移出visiableCells图张,cell2加入到reusableTableCells祸轮。之后再需要顯示的Cell就可以正常重用了。
12.ViewController 的loadView柄错、viewDidLoad、viewDidUnload分別是什么時候調(diào)用的冕房,在自定義ViewCointroller時在這幾個函數(shù)中應(yīng)該做什么工作趁矾?
由init毫捣、loadView帝际、viewDidLoad蹲诀、viewDidUnload、dealloc的關(guān)系說起
init方法
在init方法中實例化必要的對象(遵從LazyLoad思想)
init方法中初始化ViewController本身
loadView方法
當(dāng)view需要被展示而它卻是nil時则北,viewController會調(diào)用該方法痕慢。不要直接調(diào)用該方法掖举。
如果手工維護views,必須重載重寫該方法
如果使用IB維護views方篮,必須不能重載重寫該方法
loadView和IB構(gòu)建view
你在控制器中實現(xiàn)了loadView方法励负,那么你可能會在應(yīng)用運行的某個時候被內(nèi)存管理控制調(diào)用熄守。
如果設(shè)備內(nèi)存不足的時候, view 控制器會收到didReceiveMemoryWarning的消息攒发。
默認(rèn)的實現(xiàn)是檢查當(dāng)前控制器的view是否在使用晋南。
如果它的view不在當(dāng)前正在使用的view hierarchy里面负间,且你的控制器實現(xiàn)了loadView方法姜凄,那么這個view將被release, loadView方法將被再次調(diào)用來創(chuàng)建一個新的view趾访。
viewDidLoad方法
viewDidLoad 此方法只有當(dāng)view從nib文件初始化的時候才被調(diào)用扼鞋。
重載重寫該方法以進一步定制view
在iPhone OS 3.0及之后的版本中,還應(yīng)該重載重寫viewDidUnload來釋放對view的任何索引
viewDidLoad后調(diào)用數(shù)據(jù)Model
viewDidUnload方法
當(dāng)系統(tǒng)內(nèi)存吃緊的時候會調(diào)用該方法(注:viewController沒有被dealloc)
內(nèi)存吃緊時捐友,在iPhone OS 3.0之前didReceiveMemoryWarning是釋放無用內(nèi)存的唯一方式匣砖,但是OS 3.0及以后viewDidUnload方法是更好的方式
在該方法中將所有IBOutlet(無論是property還是實例變量)置為nil(系統(tǒng)release view時已經(jīng)將其release掉了)
在該方法中釋放其他與view有關(guān)的對象昏滴、其他在運行時創(chuàng)建(但非系統(tǒng)必須)的對象影涉、在viewDidLoad中被創(chuàng)建的對象、緩存數(shù)據(jù)等 release對象后匣缘,將對象置為nil(IBOutlet只需要將其置為nil鲜棠,系統(tǒng)release view時已經(jīng)將其release掉了)
一般認(rèn)為viewDidUnload是viewDidLoad的鏡像豁陆,因為當(dāng)view被重新請求時,viewDidLoad還會重新被執(zhí)行
viewDidUnload中被release的對象必須是很容易被重新創(chuàng)建的對象(比如在viewDidLoad或其他方法中創(chuàng)建的對象)表鳍,不要release用戶數(shù)據(jù)或其他很難被重新創(chuàng)建的對象
dealloc方法
viewDidUnload和dealloc方法沒有關(guān)聯(lián)祥诽,dealloc還是繼續(xù)做它該做的事情
13.ViewController的didReceiveMemoryWarning是在什么時候調(diào)用的雄坪?默認(rèn)的操作是什么?
當(dāng)程序接到內(nèi)存警告時View Controller將會收到這個消息:didReceiveMemoryWarning
從iOS3.0開始绳姨,不需要重載這個函數(shù)飘庄,把釋放內(nèi)存的代碼放到viewDidUnload中去。
這個函數(shù)的默認(rèn)實現(xiàn)是:檢查controller是否可以安全地釋放它的view(這里加粗的view指的是controller的view屬性)空郊,比如view本身沒有superview并且可以被很容易地重建(從nib或者loadView函數(shù))切揭。
如果view可以被釋放廓旬,那么這個函數(shù)釋放view并調(diào)用viewDidUnload谐腰。
你可以重載這個函數(shù)來釋放controller中使用的其他內(nèi)存十气。但要記得調(diào)用這個函數(shù)的super實現(xiàn)來允許父類(一般是UIVIewController)釋放view。
如果你的ViewController保存著view的子view的引用叶眉,那么芹枷,在早期的iOS版本中鸳慈,你應(yīng)該在這個函數(shù)中來釋放這些引用。而在iOS3.0或更高版本中绩郎,你應(yīng)該在viewDidUnload中釋放這些引用翁逞。
14.列舉Cocoa中常見的集中多線程的實現(xiàn)熄攘,并談?wù)劧嗑€程安全的幾種解決辦法,一般什么地方會用到多線程浅萧?
NSOperation NSThread@sychonized
怎么理解MVC,在Cocoa中MVC是怎么實現(xiàn)的吩案?
MVC設(shè)計模式考慮三種對象:模型對象徘郭、視圖對象丧肴、和控制器對象芋浮。模型對象代表特別的知識和專業(yè)技能,它們負責(zé)保有應(yīng)用程序的數(shù)據(jù)和定義操作數(shù)據(jù)的邏輯镇草。視圖對象知道如何顯示應(yīng)用程序的模型數(shù)據(jù)瘤旨,而且可能允許用戶對其進行編輯存哲。控制器對象是應(yīng)用程序的視圖對象和模型對象之間的協(xié)調(diào)者羽嫡。
15.ViewCotroller杭棵、Xib氛赐、delegate和notification區(qū)別,分別在什么情況下使用滓侍?
KVC(Key-Value-Coding)KVO(Key-Value-Observing)
理解KVC與KVO(鍵-值-編碼與鍵-值-監(jiān)看)
當(dāng)通過KVC調(diào)用對象時撩笆,比如:[self valueForKey:@"someKey"]時,程序會自動試圖通過幾種不同的方式解析這個調(diào)用氮兵。首先查找對象是否帶有 someKey 這個方法泣栈,如果沒找到弥姻,會繼續(xù)查找對象是否帶有someKey這個實例變量(iVar)庭敦,如果還沒有找到,程序會繼續(xù)試圖調(diào)用 -(id) valueForUndefinedKey:這個方法颠悬。
如果這個方法還是沒有被實現(xiàn)的話定血,程序會拋出一個NSUndefinedKeyException異常錯誤澜沟。
(Key-Value Coding查找方法的時候峡谊,不僅僅會查找someKey這個方法既们,還會查找getsomeKey這個方法,前面加一個get号杏,或者_someKey以及_getsomeKey這幾種形式盾致。同時荣暮,查找實例變量的時候也會不僅僅查找someKey這個變量穗酥,也會查找_someKey這個變量是否存在惠遏。)
設(shè)計valueForUndefinedKey:方法的主要目的是當(dāng)你使用-(id)valueForKey方法從對象中請求值時节吮,對象能夠在錯誤發(fā)生前器一,有最后的機會響應(yīng)這個請求祈秕。
16.id请毛、nil代表什么?
id
id和void *并非完全一樣固棚。在上面的代碼中仙蚜,id是指向struct objc_object的一個指針委粉,這個意思基本上是說贾节,id是一個指向任何一個繼承了Object(或者NSObject)類的對象。需要注意的是id是一個指針知牌,所以你在使用id的時候不需要加星號斤程。比如id foo=nil定義了一個nil指針暖释,這個指針指向NSObject的一個任意子類球匕。而id *foo=nil則定義了一個指針,這個指針指向另一個指針橄杨,被指向的這個指針指向NSObject的一個子類式矫。
nil
nil和C語言的NULL相同,在objc/objc.h中定義聪廉。nil表示一個Objctive-C對象故慈,這個對象的指針指向空(沒有東西就是空)。
17.內(nèi)存管理 Autorelease干签、retain拆撼、copy闸度、
assign的set方法和含義莺禁?
1,你初始化(alloc/init)的對象,你需要釋放(release)它柒傻。例如:
NSMutableArray aArray = [[NSArray alloc] init];
后红符,需要
[aArray release];
2伐债,你retain或copy的峰锁,你需要釋放它。例如:
[aArray retain]
后糜芳,需要
[aArray release];
3峭竣,被傳遞(assign)的對象,你需要斟酌的retain和release扣墩。例如:
obj2 = [[obj1 someMethod] autorelease];
對象2接收對象1的一個自動釋放的值呻惕,或傳遞一個基本數(shù)據(jù)類型(NSInteger蟆融,NSString)時: 你或希望將對象2進行retain守呜,以防止它在被使用之前就被自動釋放掉查乒。但是在retain后玛迄,一定要在適當(dāng)?shù)臅r候進行釋放。
18.關(guān)于索引計數(shù)
(Reference Counting)的問題
retain值 = 索引計數(shù)(Reference Counting)
NSArray對象會retain(retain值加一)任何數(shù)組中的對象虏杰。當(dāng)NSArray被卸載(dealloc)的時候纺阔,所有數(shù)組中的對象會被執(zhí)行一次釋放(retain值減一)笛钝。不僅僅是NSArray愕宋,任何收集類(Collection Classes)都執(zhí)行類似操作中贝。
例如NSDictionary雄妥,甚至UINavigationController依溯。
Alloc/init建立的對象黎炉,索引計數(shù)為1慷嗜。無需將其再次retain庆械。
[NSArray array]和[NSDate date]等”方法”建立一個索引計數(shù)為1的對象菌赖,但是也是一個自動釋放對象琉用。所以是本地臨時對象,那么無所謂了奴紧。如果是打算在全Class中使用的變量(iVar)黍氮,則必須retain它沫浆。
缺省的類方法返回值都被執(zhí)行了”自動釋放”方法滚秩。(*如上中的NSArray)
19.在類中的卸載方法”dealloc”中叔遂,release所有未被平衡的NS對象已艰。(*所有未被autorelease,而retain值為1的)
類別的作用蚕苇?
有時我們需要在一個已經(jīng)定義好的類中增加一些方法哩掺,而不想去重寫該類。比如涩笤,當(dāng)工程已經(jīng)很大嚼吞,代碼量比較多盒件,或者類中已經(jīng)包住很多方法,已經(jīng)有其他代碼調(diào)用了該類創(chuàng)建對象并使用該類的方法時舱禽,可以使用類別對該類擴充新的方法。
注意:類別只能擴充方法誊稚,而不能擴充成員變量翔始。
委托(舉例)
委托代理(degegate),顧名思義里伯,把某個對象要做的事情委托給別的對象去做城瞎。那么別的對象就是這個對象的代理,代替它來打理要做的事疾瓮。反映到程序中脖镀,首先要明確一個對象的委托方是哪個對象,委托所做的內(nèi)容是什么狼电。
委托機制是一種設(shè)計模式蜒灰,在很多語言中都用到的,這只是個通用的思想漫萄,網(wǎng)上會有很多關(guān)于這方面的介紹卷员。
那么在蘋果開發(fā)過程中,用到委托的程序?qū)崿F(xiàn)思想如下腾务,我主要拿如何在視圖之間傳輸信息做個例子毕骡。
譬如:在兩個頁面(UIIview視圖對象)實現(xiàn)傳值,用委托(delegate)可以很好做到岩瘦!
方法:
類A
@interface A:UIView
id transparendValueDelegate;
@property(nomatic, retain) id transparendValueDelegate;
@end
@implemtion A
@synthesize transparendValueDelegate
-(void)Function
{
NSString* value = @”hello”;
//讓代理對象執(zhí)行transparendValue動作
[transparendValueDelegate transparendValue: value];
}
@end
類B
@interface B:UIView
NSString* value;
@end
@implemtion B
-(void)transparendValue:(NSString*)fromValue
{
value = fromValue;
NSLog(@”the value is %@ “,value);
}
@end
//下面的設(shè)置A代理委托對象為B
//在定義A和B類對象處:
A* a = [[A alloc] init];
B* b = [[B alloc] init];
a. transparendValueDelegate = b;//設(shè)置對象a代理為對象b
這樣在視圖A和B之間可以通過委托來傳值未巫!
下面這個例子委托有兩類:
1、一個視圖類對象的代理對象為父視圖启昧,子視圖用代理實現(xiàn)讓父視圖顯示別的子視圖
2叙凡、同一父視圖下的一個子視圖為另一個子視圖的代理對象,讓另一個子視圖改變自身背景色為給定的顏色
===============================================
規(guī)范格式如下:
@protocol TransparendValueDelegate;
@interface A:UIView
id< TransparendValueDelegate > m_dTransparendValueDelegate;
@property(nomatic, retain) id m_dTransparendValueDelegate;
@end
//代理協(xié)議的聲明
@protocol TransparendValueDelegat
{
-(void)transparendValue:(NSString*)fromValue;
}
frame 和 bounds 的 區(qū)別 密末,bound的大小改變frame 改變嗎握爷?
frame: 該view在父view坐標(biāo)系統(tǒng)中的位置和大小。(參照點是严里,父親的坐標(biāo)系統(tǒng))
bounds:該view在本地坐標(biāo)系統(tǒng)中的位置和大小新啼。(參照點是,本地坐標(biāo)系統(tǒng))
20.iOS程序運行流程
1. 系統(tǒng)調(diào)用app的main函數(shù)
2. main函數(shù)調(diào)用UIApplicationMain.
3. UIApplicationMain創(chuàng)建shared application instance, UIApplication默認(rèn)的instance.
4. UIApplicationMain讀取Info.plist找到主nib文件, 加載nib刹碾,把shared application instance 設(shè)為nib的owner.
5. 通過nib文件燥撞,創(chuàng)建app的獨立UIWindows object.
6. 通過nib,實例化了程序的AppDelegate object.
7. app內(nèi)部啟動結(jié)束,application:didFinishLaunchingWith- Options: 被設(shè)定成 wAppDelegate instance.
8. AppDelegate向UIWindow instance發(fā)makeKeyAndVisible消息, app界面展示給用戶. app準(zhǔn)備好接收用戶的操作指令.
師傅領(lǐng)進門物舒,修行看個人
還有20T經(jīng)典面試題
百度一下色洞,你就知道
趕快動手吧!
……
還有超級經(jīng)典面試題冠胯,無答案火诸!
1.內(nèi)存管理的方式有哪些?
手動管理 ARC GC
2.怎樣實現(xiàn)一個 singleton的類.給出思路
3.什么是序列化或者Acrchiving,可以用來做什么,怎樣與copy結(jié)合,原理是什么?.
4.在iphone上有兩件事情要做,請問是在一個線程里按順序做效率高還是兩個線程里做效率高涵叮?為什么惭蹂?
5.runloop是什么?在主線程中的某個函數(shù)里調(diào)用了異步函數(shù)割粮,怎么樣block當(dāng)前線程,且還能響應(yīng)當(dāng)前線程的timer事件盾碗,touch事件等.
6.ios平臺怎么做數(shù)據(jù)的持久化?coredata和sqlite有無必然聯(lián)系?coredata是一個關(guān)系型數(shù)據(jù)庫嗎舀瓢?
7.闡述一個nil對象從interface bulider產(chǎn)生廷雅,到載入程序運行空間,最后被釋放時所經(jīng)歷的生命周期.
8.notification是同步還是異步? kvo是同步還是異步京髓?
9.notification是全進程空間的通知嗎航缀?kvo呢?
10.kvc是什么?kvo是什么?有什么特性堰怨?
11.響應(yīng)者鏈?zhǔn)鞘裁矗?/p>
12.unix上進程怎么通信芥玉?
13.timer的間隔周期準(zhǔn)嗎?為什么备图?怎樣實現(xiàn)一個精準(zhǔn)的timer?
14.UIscrollVew用到了什么設(shè)計模式灿巧?還能再foundation庫中找到類似的嗎?
15.如果要開發(fā)一個類似eclipse的軟件揽涮,支持插件結(jié)構(gòu)抠藕。且開放給第三方開發(fā)。你會怎樣去設(shè)計它蒋困?(大概思路)
16.C和obj-c 如何混用盾似?
17.以下每行代碼執(zhí)行后,person對象的retain count分別是多少?Person *person = [[Person alloc] init]; // count 1?[person retain]; // count 2?[person release]; //count 1?[person release]; //retain count = 1;
18.ViewController 的 didReceiveMemoryWarning 是在什么時候被調(diào)用的雪标?
19.內(nèi)存出現(xiàn)警告時零院。
20.ios9新特性有那些?
Everybody村刨,上面這20T靠自己喲门粪!
如果你也是一名iOS開發(fā)者,可以加入小編的iOS學(xué)習(xí)交流群605315994烹困,一起交流學(xué)習(xí)成長。
我是曉媛乾吻,喜歡記得關(guān)注我哦髓梅!