iOS常見(jiàn)筆試題目

1.objective-c中的數(shù)字對(duì)象都有哪些,簡(jiǎn)述它們與基本數(shù)據(jù)類型的區(qū)別是什么。
oc中用NSNumber類來(lái)包裝基本數(shù)據(jù)類型,基本類型只是一個(gè)值,沒(méi)有任何行為。

2.怎樣自動(dòng)生成屬性的獲取方法和設(shè)置方法。
將屬性設(shè)置成@property,Xcode會(huì)根據(jù)屬性中的特性(retain,copy,assign)自動(dòng)生成不同的getter和setter方法,這個(gè)具體的內(nèi)部實(shí)現(xiàn)是不可見(jiàn)的。

// retain 性質(zhì)的setter內(nèi)部實(shí)現(xiàn)
-(void)setName:(NSString *)name{
    if (_name != name) {
        [_name release];        // 舊值release
        _name = [name retain];  // 新值retain
    }
}
// copy 性質(zhì)的setter內(nèi)部實(shí)現(xiàn)
-(void)setName:(NSString *)name{
    if (_name != name) {
        [_name release];
        _name = [name copy];
    }
}
// getter 的系統(tǒng)內(nèi)部實(shí)現(xiàn)
-(NSString *)getName{
    return [[_name retain] autorelease];
}

3.oc的類可以多繼承么?可以用什么方式實(shí)現(xiàn)多繼承?
oc只支持單繼承,可以通過(guò)類別和協(xié)議的方式來(lái)實(shí)現(xiàn)多繼承。

4.id聲明的對(duì)象有什么特征
id類型的變量可以存放任何數(shù)據(jù)類型的對(duì)象。在內(nèi)部處理上,這種類型被定義為指向?qū)ο蟮闹羔槪瑢?shí)際上是一個(gè)指向這種對(duì)象的實(shí)例變量的指針。

5.instanceType

6.category,protocol,delegate,extension,
category:類別是一種為現(xiàn)有的類添加新方法的方式,可以為任何類添加category,哪怕是那些沒(méi)有源碼的類。
注意: 無(wú)法向category中添加新的實(shí)例變量,運(yùn)行時(shí)報(bào)錯(cuò)??梢杂胷umtime解決。當(dāng)category中方法名與現(xiàn)有類名重名時(shí),類別具有更高的優(yōu)先級(jí),將取代現(xiàn)有的方法。
NSString+NumberConvience.h

protocol:協(xié)議是一個(gè)方法簽名列表,其中定義了若干個(gè)方法,@required這是委托對(duì)象必須實(shí)現(xiàn)的,@optional這是可選的。

`@protocol xxxDelegate`
`method1,method2`
`@property(nonatomic,assign)id<xxDelegate> delegate`

delegate: 委托是一種對(duì)象,是實(shí)現(xiàn)協(xié)議的對(duì)象。比如類B設(shè)置了類A的delegate對(duì)象為其自身,那么類B就要實(shí)現(xiàn)類A中制定的某些方法。協(xié)議和代理在iOS中是配合使用的。

extension: 擴(kuò)展可以理解成是沒(méi)有名字的分類,擴(kuò)展可以添加屬性,成員變量,方法名稱。類擴(kuò)展寫(xiě)在.m中,這些內(nèi)容就都是私有的了,只有本類才可見(jiàn)。

7.ios如何做數(shù)據(jù)持久化?coredata和sqlite有無(wú)必然聯(lián)系?coredata是一個(gè)關(guān)系型數(shù)據(jù)庫(kù)么?

8.UIView和CALayer有什么區(qū)別?

9.如何理解單利
所謂單利應(yīng)該是“創(chuàng)建一次,永久有效”,單利應(yīng)該只用來(lái)保存全局的狀態(tài),并且不能和任何作用域綁定,如果這個(gè)作用域的生命周期比一個(gè)完整的應(yīng)用的生命周期短,那么這種狀態(tài)的變量就不能用單利來(lái)管理。http://objccn.io/issue-13-2/

+(instancetype)sharedInstance{
    static dispatch_once_t once;
    static id sharedInstance;
    dispatch_once(&once, ^{
        sharedInstance = [[self alloc] init];
    });
    return sharedInstance;
}

10.深拷貝與淺拷貝
深拷貝創(chuàng)建的對(duì)象自主分配內(nèi)存空間,與源對(duì)象互不影響,各自獨(dú)立。淺拷貝產(chǎn)生的對(duì)象與源對(duì)象共享同一個(gè)內(nèi)存地址,當(dāng)指向這片內(nèi)存的地址被銷(xiāo)毀時(shí),指向這塊內(nèi)存的指針要重新定義,否則會(huì)產(chǎn)生野指針。http://www.itdecent.cn/p/cd623207c5ac

11.多線程,NSOperation,GCD

12.__block,__weak

13.線程與進(jìn)程的區(qū)別


process_thread_task.png

14.簡(jiǎn)述UIButton的繼承關(guān)系
UIButton的父類是UIControl,UIControl的父類是UIView,UIView的父類是UIResponder

15.簡(jiǎn)述weak,strong,assign,copy,retain關(guān)鍵字
1.在ARC中,使用weak來(lái)避免循環(huán)引用,比如delegate的屬性(也可以用assign修飾),weak修飾符必須用于oc對(duì)象。
2.strong
3.在非ARC中,assign是property的默認(rèn)屬性,無(wú)論這個(gè)屬性是何種類型的數(shù)據(jù)。但是assign常用于修飾簡(jiǎn)單的數(shù)據(jù)類型,當(dāng)然它修飾的property不會(huì)持有一個(gè)對(duì)象。
4.copy修飾的變量必須是oc類型的數(shù)據(jù),copy將會(huì)產(chǎn)生一個(gè)新的對(duì)象,這個(gè)新對(duì)象的引用計(jì)數(shù)+1,如果一個(gè)對(duì)象被copy修飾,那么賦值到這個(gè)屬性時(shí),是對(duì)原來(lái)對(duì)象的一個(gè)拷貝,且是復(fù)制一個(gè)不可變的對(duì)象。比如說(shuō)一個(gè)可變的數(shù)組用copy修飾,當(dāng)再對(duì)這個(gè)數(shù)組進(jìn)行添加,刪除或者修改時(shí)就會(huì)造成崩潰。用copy修飾后它已經(jīng)是一個(gè)不可變的對(duì)象了。
5.retain修飾的屬性也是oc類型的數(shù)據(jù),用retain修飾的屬性,代表這個(gè)屬性持有它所指的對(duì)象。每retain一次引用計(jì)數(shù)+1,

6.小結(jié)一下:
對(duì)于NSString,NSDictionary,NSArray等這類不可變的對(duì)象用copy修飾;
delegate為避免強(qiáng)引用,使用weak或者assign修飾;
如NSMutableString,NSMutableArray,NSMutableDictionary等可變對(duì)象用copy修飾;

http://rypress.com/tutorials/objective-c/properties

16.ARC下,不顯式指定任何屬性關(guān)鍵字時(shí),默認(rèn)的關(guān)鍵字都有哪些
1.對(duì)應(yīng)基本數(shù)據(jù)類型默認(rèn)關(guān)鍵字是 atomic,readwrite,assign
2.對(duì)于普通的 Objective-C 對(duì)象 atomic,readwrite,strong

17.說(shuō)說(shuō)#import,#include和@class
1、import會(huì)包含這個(gè)類的所有信息,使用這個(gè)會(huì)把引用類的頭文件過(guò)一遍,即把.h文件里的變量和方法包含進(jìn)來(lái)一次,且僅一次。
2、包含c/c++頭文件時(shí)用#include,#include比起#import有可能會(huì)引起交叉編譯。
3、@class來(lái)聲明這個(gè)名詞是類的名稱,不需要知道其內(nèi)部的變量和方法,使用這種編譯的效率更高。

18.iOS的屏幕適配
1.iPhone4s屏幕大小坐標(biāo)不變,使用絕對(duì)定位,使用.png和@2x.png,系統(tǒng)自動(dòng)選擇使用哪張圖片。
2.iPhone5/5c/5s,屏幕多出88個(gè)點(diǎn),使用AutoLayout技術(shù)解決適配問(wèn)題,使用~@2x.png
3.iphone6/6s,使用AutoLayout適配,~@2x.png ~@3x.png

  1. NSNull,nil,null

|標(biāo)志 | 值| 含義| 補(bǔ)充|
|--------------|----------|-------|
|NULL | (void *)0 | C指針的字面零值| NULL作為指針|
|nil |(id)0 |Objective-C對(duì)象的字面零值| 指向一個(gè)不存在對(duì)象的指針|
|Nil |(Class)0| Objective-C類的字面零值| 指向零的類指針|
|NSNull |[NSNull null] |用來(lái)表示零值的單獨(dú)的對(duì)象| 對(duì)象|

20.深度拷貝與淺拷貝
深拷貝雖然新對(duì)象與源對(duì)象的內(nèi)容相同,但是兩者使用的是不同的內(nèi)存區(qū)域,相互獨(dú)立受影響。
淺拷貝產(chǎn)生的新對(duì)象指向源對(duì)象的地址,當(dāng)源對(duì)象被銷(xiāo)毀后后新對(duì)象會(huì)成為野指針。

21.copy和mutableCopy的區(qū)別

22.程序在內(nèi)存中的分配情況

23.static關(guān)鍵字
在變量前面加上static關(guān)鍵字,只在程序啟動(dòng)的時(shí)候初始化它的值。

static int sCount = 100;
-(void)testStatic{
    sCount+=5;
    NSLog(@"sCount = %d",sCount);// 結(jié)果:105
    for (int i=0; i<5; i++) {
        sCount++;
    }
    NSLog(@"sCount = %d",sCount);// 結(jié)果:110
}

24.如何優(yōu)化TableView
1.在
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath中做數(shù)據(jù)綁定
2.可以使用一個(gè)類方法來(lái)動(dòng)態(tài)的計(jì)算cell的高度,而不是在初始化cell實(shí)例并綁定數(shù)據(jù)后去獲得它的高度。
3.或者使用AutoLayout將rowHeight變量設(shè)置為UITableViewAutomaticDimension來(lái)設(shè)置cell的動(dòng)態(tài)高度。(這個(gè)要求iOS8及更高版本)。如果你cell的子視圖很多,這個(gè)方法也不見(jiàn)得好使。子視圖越多,AutoLayout的效率就越低。
4.減少無(wú)用的混合區(qū)域,不要使用透明背景。
5.平衡CPU和GPU的負(fù)載,可以將某些渲染工作用CPU來(lái)處理。
6.對(duì)所有像素相關(guān)的數(shù)據(jù)做四舍五入處理,包括坐標(biāo),UIView的寬高。
7.異步UI(將一些耗時(shí)與UI有關(guān)的工作放到另一個(gè)線程中處理)。

總之:盡快的返回cell,tableview就會(huì)越流暢。

Instruments
color blended layers
color misaligned images
color off-screen rendered

25.const關(guān)鍵字
const意味著只讀,一旦變量被const修飾,那么就不能再修改它了,否則編譯時(shí)直接報(bào)錯(cuò)。

26.對(duì)于枚舉常用如下風(fēng)格的

typedef NS_OPTIONS(<#_type#>, <#_name#>) <#new#>;
typedef NS_ENUM(<#...#>) <#new#>;

27.對(duì)于一些變量應(yīng)盡量使用Foundation數(shù)據(jù)類型的,不要直接用基本的數(shù)據(jù)類型,如int,float,long等。

28.簡(jiǎn)單描述下ios的網(wǎng)絡(luò)請(qǐng)求
GET請(qǐng)求的參數(shù)會(huì)作為鏈接的一部分暴露出來(lái),服務(wù)器地址和參數(shù)之間用"?"分隔。GET請(qǐng)求一般多用于向服務(wù)端拉取數(shù)據(jù)。
POST請(qǐng)求的參數(shù)跟服務(wù)器ip分開(kāi),請(qǐng)求接口中只有服務(wù)器地址,參數(shù)作為請(qǐng)求的一部分提交給后臺(tái)。POST請(qǐng)求多用于像服務(wù)端提交數(shù)據(jù)。
網(wǎng)絡(luò)請(qǐng)求有兩種方式
1.同步GET
2.同步POST
3.異步GET
4.異步POST

29.有關(guān)RunTime
runtime是一個(gè)有c和匯編語(yǔ)言構(gòu)成的開(kāi)源庫(kù),它所做的事情是加載類信息,進(jìn)行方法的分發(fā)和轉(zhuǎn)發(fā),Object-C作為一門(mén)動(dòng)態(tài)語(yǔ)言正是得益于runtime,函數(shù)的編譯和鏈接可以推遲到運(yùn)行時(shí)進(jìn)行,給一個(gè)對(duì)象發(fā)送的消息不會(huì)立即執(zhí)行,而是在運(yùn)行的時(shí)候再去找它對(duì)應(yīng)的實(shí)現(xiàn)。runtime的好處在于增強(qiáng)了代碼的靈活性,
1.動(dòng)態(tài)類型id,任何數(shù)據(jù)對(duì)象類都可以用id指定
2.動(dòng)態(tài)綁定,實(shí)例所屬類確定后,將某些屬性和相應(yīng)的方法綁定到實(shí)例上。
3.動(dòng)態(tài)加載,比如加載@2x的圖片

使用objc_msgSend函數(shù),會(huì)執(zhí)行以下步驟
通過(guò)對(duì)象(類)的isa指針去找到他的class
在class的method list 找到該消息的實(shí)現(xiàn)
如果class中沒(méi)有改消息的實(shí)現(xiàn),就繼續(xù)到它的super_class中去找
一旦找到這個(gè)這個(gè)消息的實(shí)現(xiàn),那么就去執(zhí)行他的IMP
這樣的話每發(fā)送一個(gè)消息就要方法列表objc_method_list進(jìn)行一次遍歷,為了提高效率,使用了objc_cache對(duì)經(jīng)常調(diào)用的函數(shù)進(jìn)行緩存,再次調(diào)用時(shí)就先到objc_cache中去查找函數(shù)實(shí)現(xiàn)。

30.RunLoop

31.內(nèi)存管理
1、為什么要使用內(nèi)存管理?
用于對(duì)象間傳遞和共享數(shù)據(jù)。

2、不要向一個(gè)已經(jīng)釋放的對(duì)象發(fā)送消息。
3、循環(huán)引用,多個(gè)對(duì)象造成引用環(huán)。弱引用雖然持有對(duì)象,但是并不增加引用計(jì)數(shù),以此來(lái)避免循環(huán)引用的問(wèn)題。例如delegate用weak或者assign修飾。

1、ARC是編譯時(shí)的特性,而非運(yùn)行時(shí),更不是GCD
2、對(duì)于某些特定文件
開(kāi)啟ARC:-fobjc-arc
關(guān)閉ARC:-fno-objc-arc

28.loadView
1-> 訪問(wèn)UIViewController的view時(shí),并且view為nil時(shí)會(huì)調(diào)用此方法(self.view,controller.view)。
2-> 調(diào)用[super loadView]時(shí)候,會(huì)先查找該UIViewController相關(guān)聯(lián)的xib(若無(wú)關(guān)聯(lián)則加載與該UIViewController同名的xib),通過(guò)xib來(lái)加載view。若未找到任何相關(guān)的xib,就會(huì)創(chuàng)建一個(gè)空白的view。然后付給UIViewController的view。
3-> loadView方法的具體使用情況是,當(dāng)xib不聽(tīng)使喚我們需要手寫(xiě)代碼的時(shí)候,重寫(xiě)loadView即可。
我們想用代碼實(shí)現(xiàn)某些功能的時(shí)候

viewDidUnload
viewDidUnload已經(jīng)被廢棄了,當(dāng)內(nèi)存緊張的時(shí)候view被釋放,viewDidUnload被調(diào)用,釋放與界面相關(guān)的元素以及實(shí)例都被賦值為nil。與dealloac的關(guān)系是,dealloac會(huì)在UIViewController被釋放的時(shí)候調(diào)用。

順序:loadView、viewDidLoad、viewDidUnload

29.http狀態(tài)碼

HTTP狀態(tài)碼的五大類
100-199 用于指定客戶端應(yīng)相應(yīng)的某些動(dòng)作。
200-299 用于表示請(qǐng)求成功。
300-399 用于已經(jīng)移動(dòng)的文件并且常被包含在定位頭信息中指定新的地址信息。
400-499 用于指出客戶端的錯(cuò)誤。
500-599 用于支持服務(wù)器錯(cuò)誤
成功2××
 成功處理了請(qǐng)求的狀態(tài)碼。
200
服務(wù)器已成功處理了請(qǐng)求并提供了請(qǐng)求的網(wǎng)頁(yè)。
204
 服務(wù)器成功處理了請(qǐng)求,但沒(méi)有返回任何內(nèi)容。


重定向3××
 每次請(qǐng)求中使用重定向不要超過(guò) 5 次。
301
 請(qǐng)求的網(wǎng)頁(yè)已永久移動(dòng)到新位置。當(dāng)URLs發(fā)生變化時(shí),使用301代碼。搜索引擎索引中保存URL。
302
 請(qǐng)求的網(wǎng)頁(yè)臨時(shí)移動(dòng)到新位置。搜索引擎索引中保存原來(lái)的URL。
304
如果網(wǎng)頁(yè)自請(qǐng)求者上次請(qǐng)求后沒(méi)有更新,則用304代碼告訴搜索引擎機(jī)器人,可節(jié)省帶寬和開(kāi)銷(xiāo)。


客戶端錯(cuò)誤4×× 表示請(qǐng)求可能出錯(cuò),妨礙了服務(wù)器的處理。
400
 服務(wù)器不理解請(qǐng)求的語(yǔ)法。
403
服務(wù)器拒絕請(qǐng)求。
404
 服務(wù)器找不到請(qǐng)求的網(wǎng)頁(yè)。服務(wù)器上不存在的網(wǎng)頁(yè)經(jīng)常會(huì)返回此代碼。
410
 請(qǐng)求的資源永久刪除后,服務(wù)器返回此響應(yīng)。該代碼與 404(未找到)代碼相似,但在資源以前存在而現(xiàn)在不存在的情況下,有時(shí)用來(lái)替代404代碼。如果資源已永久刪除,應(yīng)當(dāng)使用 301 指定資源的新位置。


服務(wù)器錯(cuò)誤5××
 表示服務(wù)器在處理請(qǐng)求時(shí)發(fā)生內(nèi)部錯(cuò)誤。這些錯(cuò)誤可能是服務(wù)器本身的錯(cuò)誤,而不是請(qǐng)求出錯(cuò)。
500
 服務(wù)器遇到錯(cuò)誤,無(wú)法完成請(qǐng)求。
503
 服務(wù)器目前無(wú)法使用(由于超載或停機(jī)維護(hù))。

更多內(nèi)容:
https://github.com/ChenYilong/iOSInterviewQuestions/blob/master/01%E3%80%8A%E6%8B%9B%E8%81%98%E4%B8%80%E4%B8%AA%E9%9D%A0%E8%B0%B1%E7%9A%84iOS%E3%80%8B%E9%9D%A2%E8%AF%95%E9%A2%98%E5%8F%82%E8%80%83%E7%AD%94%E6%A1%88/%E3%80%8A%E6%8B%9B%E8%81%98%E4%B8%80%E4%B8%AA%E9%9D%A0%E8%B0%B1%E7%9A%84iOS%E3%80%8B%E9%9D%A2%E8%AF%95%E9%A2%98%E5%8F%82%E8%80%83%E7%AD%94%E6%A1%88%EF%BC%88%E4%B8%8A%EF%BC%89.md

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • @synthesize和@dynamic分別有什么作用?@property有兩個(gè)對(duì)應(yīng)的詞,一個(gè)是 @synthes...
    筆筆請(qǐng)求閱讀 631評(píng)論 0 1
  • *面試心聲:其實(shí)這些題本人都沒(méi)怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
    Dove_iOS閱讀 27,602評(píng)論 30 472
  • 每日推薦: 每日一歌――王菲《但愿人長(zhǎng)久》 每日一詩(shī)――晏殊《中秋月》 十輪霜影轉(zhuǎn)庭梧 此夕羈人獨(dú)向隅 未必素娥無(wú)...
    薩拉芯雪閱讀 184評(píng)論 0 0
  • 山櫻陌上初紅,楊柳新綠溪邊。 二月風(fēng)日正好,攜友閑繞花枝。 花間春景媚,人面映桃花。
    繭語(yǔ)無(wú)聲閱讀 329評(píng)論 0 0
  • 1、容器視圖實(shí)現(xiàn)的側(cè)滑示例圖效果如下所示: 2、代碼部分如下所示: 3、說(shuō)一下實(shí)現(xiàn)的思路 3.1、使用側(cè)滑手勢(shì)來(lái)拿...
    JSOfJackChen閱讀 364評(píng)論 0 0

友情鏈接更多精彩內(nèi)容