日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

iOS面试题 第一天

發(fā)布時(shí)間:2025/4/16 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS面试题 第一天 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

今天上午,下午分別面試了兩家公司。上午是一家互聯(lián)網(wǎng)公司,氣氛還比較好,是我比較喜歡的。技術(shù)這塊是直接機(jī)試,主要是給了些BUG讓我修復(fù),整個(gè)過程還算順利。下午去了一家大型的證券公司。整理技術(shù)問題如下:

1. UIView的生命周期是什么樣的,執(zhí)行順序是怎么樣的?
init —— loadView —— viewDidLoad ——?viewWillAppear?—— viewWillDisappear —— viewDidUnload —— dealloc.

2. UIViewController在什么時(shí)候會(huì)加載UIView,換句話說,技術(shù)上在哪個(gè)時(shí)間點(diǎn)會(huì)執(zhí)行l(wèi)oadView。
這個(gè)問題我沒有答上來,原來寫程序只知道是在addSubview或pushViewController的時(shí)候,程序就會(huì)執(zhí)行l(wèi)oadView。于是覺得,loadView是在UIView要被顯示出來之前執(zhí)行的。后來了解到,這種說法其實(shí)有點(diǎn)本末倒至了。是因?yàn)閳?zhí)行了loadView,所以UIView才會(huì)被顯示出來。正確的答案是,在view對(duì)象第一次被訪問的時(shí)候,會(huì)執(zhí)行l(wèi)oadView。

3. UITableView的執(zhí)行流程是怎么樣的?
省去UIView相關(guān)的不說,就UITableView來說,每個(gè)UITableView都會(huì)有一個(gè)delegate,delegate指向的對(duì)象會(huì)接受UITableView的委托從而實(shí)現(xiàn)一系列的方法。其主要的幾個(gè)方法執(zhí)行順序如下:
numberOfSectionsInTableView——numberOfRowsInSection——titleForHeaderInSection——cellForRowAtIndexPath

4. UITableView是怎樣實(shí)現(xiàn)Cell的重用的?
UITableView中有一個(gè)數(shù)組,visibleCells,保存可視的cell。假設(shè)一屏可以顯示10個(gè)cell。當(dāng)向上滑動(dòng)tableView時(shí),第1個(gè)cell移出可視范圍,同時(shí)第11個(gè)cell顯示出來。如果cell是通過dequeueReusableCellWithIdentifier方法得到的,其本質(zhì)上,是將第一個(gè)cell放到第11個(gè)的位置,然后內(nèi)容按照indexPath的要求重繪出來,但并不會(huì)清除cell中的subView。這也是為什么在cell中添加了UILabel后,上下拉動(dòng)時(shí),會(huì)有重影(多個(gè)UILabel重疊)。要避免此情況,Apple推薦自定義UITableViewCell。如果不自定義cell的話,可以為不同indexPath的cell定義不同的cellIdentifier。或是每次都通過遍歷subview刪除所有子視圖,再重新addSubView,等等。

5. 如何設(shè)計(jì)一個(gè)可變高度(根據(jù)內(nèi)容自適應(yīng)高度)的UITableViewCell?
這個(gè)真是讓人蛋疼,我原來確實(shí)沒有遇到過這樣的需求,做法都是定高,然后文字內(nèi)容多了,直接省略,引導(dǎo)用戶點(diǎn)擊進(jìn)入下一層觀看。當(dāng)時(shí)間歇性腦殘的說了句不知道,后來想想,真的很簡(jiǎn)單:
我們?cè)赾onfigureCell的時(shí)候,通過sizeWithFont方法獲取UILabel的CGSize,從而得出自定義cell的高度,然后在heightForRowAtIndexPath里進(jìn)行對(duì)應(yīng)的賦值就可以了。-_-!!!

6. 談?wù)剝?nèi)存管理機(jī)制。
這個(gè)大家基本都了解,Objective-C是通過retainCount來決定是否回收內(nèi)存。每個(gè)NSObject都有一個(gè)計(jì)數(shù)器retainCount,當(dāng)alloc時(shí),retainCount的值為1,并且每次retain都會(huì)加1,release會(huì)減1,當(dāng)retainCount為0的時(shí)候,內(nèi)存會(huì)被釋放。由此引發(fā)了另一個(gè)問題,NSString通過stringWithString創(chuàng)建的對(duì)象,他的作用域是什么呢?什么時(shí)候會(huì)被釋放?我覺得,通過上述靜態(tài)方法創(chuàng)建的對(duì)象約等于,[[[NSString alloc] initWithString:@”"] autorelease]; 也就是說,他是一個(gè)autorelease的對(duì)象,被放入NSAutoreleasePool中。系統(tǒng)會(huì)為每個(gè)RunLoop建立一個(gè)NSAutoreleasePool,當(dāng)RunLoop結(jié)束時(shí),autoreleasePool里的內(nèi)存將被釋放。
注:答題時(shí)我混淆了閉包和RunLoop的概念,把RunLoop說成了閉包。后面講Block會(huì)談到。

7. 談?wù)剬?duì)block的了解。
block才是閉包。閉包是一個(gè)函數(shù)或指向函數(shù)的指針,再加上其外部變量(也叫自由變量)。block有三種,NSConcreteGlobal, NSConcreteStack, NSConcreteMalloc。block是可以訪問block外部的變量的。
NSConcreteGlobal: 就像一個(gè)全局函數(shù)一樣,從頭到尾待在那,始終是可用的。當(dāng)Block中沒有引用外部變量時(shí),block為global類型的。
NSConcreteStack: 保存在棧中的block,block執(zhí)行完后內(nèi)存會(huì)被釋放掉。當(dāng)block引用了外部變量時(shí),block為stack類型的。
NSConcreteMallock: 保存在堆中的block,block為引用記數(shù)為0時(shí),內(nèi)存會(huì)被釋放掉。當(dāng)block執(zhí)行copy時(shí),block會(huì)從棧中復(fù)制到堆中。
以上都針對(duì)非ARC環(huán)境而言,如果在ARC環(huán)境下,引用外部變量的block會(huì)自動(dòng)保存在堆中,無(wú)需copy。

目前整理的就這么多,KVO,Delegate等設(shè)計(jì)模式今天沒談到。還有7個(gè)公司的面試等著哥呢,海量投簡(jiǎn)歷的孩紙傷不起啊。我會(huì)持續(xù)更新。

轉(zhuǎn)載于:https://www.cnblogs.com/lingzhao/p/3731272.html

總結(jié)

以上是生活随笔為你收集整理的iOS面试题 第一天的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。