<strike id="uyq0s"></strike>

<ul id="uyq0s"></ul>
  • <th id="uyq0s"><s id="uyq0s"></s></th>
    <strike id="uyq0s"></strike>
    好獵頭網(wǎng)-中高級(jí)人才獵頭網(wǎng)站!服務(wù)熱線:400-1801-668 好獵頭   |   登錄 注冊(cè)

    iOS工程師面試筆試題

    添加時(shí)間:2018-04-12 10:49:28
    瀏覽次數(shù): 0
    前言:以下iOS工程師面試筆試題,部分來(lái)源于網(wǎng)絡(luò),筆者在此處收集起來(lái),既是要鞏固自我,也希望能夠幫助到同樣需要的人!參考答案均為筆者所寫,其有疑問(wèn)或者出錯(cuò)之處,請(qǐng)?jiān)谠u(píng)論中提出,謝謝!不喜勿噴!

    1. #import和#include的區(qū)別?

    參考答案:

    #import是Objective-C導(dǎo)入頭文件的語(yǔ)法,可保證不會(huì)重復(fù)導(dǎo)入。
    #include是C/C++導(dǎo)入頭文件的語(yǔ)法,如果是Objective-C與C/C++混編碼,對(duì)于C/C++類型的文件,還是使用#include來(lái)引入,這種寫法需要添加防重復(fù)導(dǎo)入的語(yǔ)法。

    2. @class的作用

    參考答案:

    @class一般用于頭文件中通過(guò)前向聲明,就可以聲明了,但是在.m文件中還是需要使用#import進(jìn)來(lái)的。它的作用只是前向聲明。

    3. 用NSLog函數(shù)輸出一個(gè)浮點(diǎn)類型,結(jié)果四舍五入,并保留一位小數(shù)

    參考答案:

    float money = 1.011;
    NSLog(@"%.1f", money);

    使用%f來(lái)格式化,其中要保留一位小數(shù),因此再用%.1f就是保留一位。

    4.property屬性的修飾符有什么樣的作用

    參考答案:

    property是屬性訪問(wèn)聲明,擴(kuò)號(hào)內(nèi)支持以下幾個(gè)屬性:
    getter=getName、setter=setName:設(shè)置setter與getter的方法名
    readwrite、readonly:設(shè)置可供訪問(wèn)級(jí)別
    assign:方法直接賦值,不進(jìn)行任何retain操作,為了解決原類型與環(huán)循引用問(wèn)題
    retain:其setter方法對(duì)參數(shù)進(jìn)行release舊值再retain新值,所有實(shí)現(xiàn)都是這個(gè)順序
    copy:其setter方法進(jìn)行copy操作,與retain處理流程一樣,先對(duì)舊值release,再copy出新的對(duì)象,retainCount為1。這是為了減少對(duì)上下文的依賴而引入的機(jī)制。
    nonatomic:非原子性訪問(wèn),不加同步, 多線程并發(fā)訪問(wèn)會(huì)提高性能。注意,如果不加此屬性,則默認(rèn)是兩個(gè)訪問(wèn)方法都為原子型事務(wù)訪問(wèn)。

    5. self.name=@object和name=@object有什么不同?

    參考答案:

    self.name =”object”:會(huì)調(diào)用對(duì)象的setName()方法;name = “object”:會(huì)直接把"object"字符串賦值給當(dāng)前對(duì)象的name屬性。

    6. viewDidLoad、loadView和viewDidUnload何時(shí)調(diào)用

    參考答案:

    viewDidLoad在view加載完成時(shí)調(diào)用,loadView在controller的view為nil時(shí)調(diào)用。對(duì)于viewDidUnload現(xiàn)在已經(jīng)不能直接調(diào)用了。

    7. objective-c中的可變與不可變?cè)~典

    參考答案:

    可變字典就是可以增、刪、改操作的字典,對(duì)應(yīng)于NSMutableDictionary類型。
    不可變字典就是不能執(zhí)行增、刪、改操作的字典,對(duì)應(yīng)于NSDictionary類型。

    8.Objective-C的內(nèi)存管理

    參考答案:?

    現(xiàn)在內(nèi)存管理幾乎都采用ARC,也就是Automatic Reference Counting,意思是自動(dòng)引用計(jì)數(shù)。由編譯器在編譯時(shí)自動(dòng)為添加retain、release等代碼。

    如果問(wèn)的MRC,也就是Manual Reference Counting,意思是手動(dòng)內(nèi)存管理。

    黃金法則:誰(shuí)使對(duì)象的引用計(jì)數(shù)+1,不再使用該對(duì)象時(shí),誰(shuí)就應(yīng)該使該對(duì)象的引用計(jì)數(shù)-1。

    9. 自動(dòng)生成getter/setter方法

    參考答案:

    對(duì)于以前的代碼,那時(shí)還沒有property,使用這樣的方法來(lái)創(chuàng)建:

    - (void)setName:(NSString *)aName;
    - (NSString *)name;

    在后面有了property,直接使用@property (nonatomic, copy) NSString *name這樣的方法來(lái)聲明,編譯器會(huì)自動(dòng)生成getter/setter方法并生成一個(gè)_name成員變量。

    10. 什么是MVC

    參考答案:

    我相信大部分人在被問(wèn)到這個(gè)問(wèn)題時(shí),都會(huì)回答M就是Model,V就是View,C就是Controller。這都是停留在概念上的回答,明顯沒有什么工作經(jīng)驗(yàn)。對(duì)于一個(gè)對(duì)框架和架構(gòu)有一定的思想的人,回答時(shí)會(huì)從項(xiàng)目的耦合度、團(tuán)隊(duì)開發(fā)如何減少?zèng)_突、如何降低團(tuán)隊(duì)與團(tuán)隊(duì)之間的溝通成本、如何將M、V、C之間按照既定的標(biāo)準(zhǔn)建立溝通的橋梁。

    Model用于處理數(shù)據(jù),通常來(lái)說(shuō),Model中會(huì)包含多個(gè)字段,用于存儲(chǔ)數(shù)據(jù)。但是,Model還會(huì)有一部分邏輯,比如說(shuō):

    @interface TestModel: HYBBaseModel?
    ?// 這個(gè)是接口返回的字段,1表示XXX,2表示YYY,3表示ZZZ
    @property (nonatomic, assign) NSUInteger type;?
    // 這個(gè)不是接口返回的字段,但是由于`type`字段是一個(gè)數(shù)值,不是`view`需要顯示的數(shù)據(jù)
    // 所以我們最好將邏輯統(tǒng)一放到這里來(lái),外部只管獲取最終顯示需要的值即可。即使哪天接口
    // 返回的字段變化或者增加什么新的值,只需要處理這個(gè)模型內(nèi)部就好了。?
    @property (nonatomic, copy, readonly) NSString relationship;
    @end

    對(duì)于View,不應(yīng)該包含邏輯,應(yīng)該根據(jù)模型直接獲取數(shù)據(jù)。

    對(duì)于Controller,大部分交互邏輯都集中到了這里,所有View需要的數(shù)據(jù),都是通過(guò)Controller提取Model然后交給view去顯示數(shù)據(jù)。

    11. 重寫getter/setter方法

    假設(shè)聲明屬性:

    @property (nonatomic, copy) NSString *blogName;
    重寫這個(gè)屬性的getter/setter方法:

    參考答案:

    這里一旦連getter方法也重寫,編譯器不會(huì)給我們自動(dòng)生成成員變量_blogName,因此我們需要在類的聲明中添加一個(gè)成員變量_blogName:

    @interface Demo () {
    ? ?NSString *_blogName;
    }
    ?@end

    在自動(dòng)內(nèi)存管理下(ARC):

    - (void)setBlogName:(NSString *)aName {
    ? ?if (_blogName != aName) {
    ? ? ? _blogName = nil;
    ? ? ? _blogName = [aName copy];
    ? ?}
    }
    - (NSString *)blogName {
    ? return _blogName;
    }
    對(duì)于手動(dòng)內(nèi)存管理(MRC):
    - (void)setBlogName:(NSString *)aName {
    ? ?if (_blogName != aName) {
    ? ? ? [_blogName release];
    ? ? ? _blogName = nil;
    ? ? ? _blogName = [aName copy];
    ? ?}
    }
    - (NSString *)blogName {
    ? return _blogName;
    }


    12. obj在編譯時(shí)和運(yùn)行時(shí)分別時(shí)什么類型的對(duì)象

    如下面的代碼,obj在編譯時(shí)和運(yùn)行時(shí)分別時(shí)什么類型的對(duì)象:
    NSString *obj = [[NSData alloc] init];

    參考答案:

    在編譯時(shí),我們所聲明的obj是NSString *類型,因此是NSString類型對(duì)象。在運(yùn)行時(shí),由于指針obj所指向的是NSData類型對(duì)象的內(nèi)存,因此實(shí)際上是NSData類型的對(duì)象。在編譯時(shí),這一行代碼會(huì)轉(zhuǎn)換成類似這樣:

    NSString *obj = ((id (*)(id, SEL))objc_msgSend)([NSData class], @selector(alloc));
    obj = ((id (*)(id, SEL))objc_msgSend)((id)obj, @selector(init));

    由于在編譯時(shí),轉(zhuǎn)換成id,因此可以用NSString *指向NSData對(duì)象,而id是具備運(yùn)行時(shí)特性的,因此在鏈接時(shí),通過(guò)id的isa指針可以找到其所屬的類,因此最終類型還是通過(guò)isa確定其所屬類型。

    13. id聲明的對(duì)象有什么特性?

    id類型可以指向任何類型的對(duì)象。

    參考答案:
    我們先看看其定義:

    /// Represents an instance of a class.
    struct objc_object {
    ? ? Class isa ?OBJC_ISA_AVAILABILITY;
    };
    /// A pointer to an instance of a class.
    typedef struct objc_object *id;

    可其定義可知id類型是一個(gè)指向objc_object結(jié)構(gòu)體類型的指針,這個(gè)結(jié)構(gòu)體只有一個(gè)指向?qū)ο鬅o(wú)類的指針isa,因此id可以指向任何類型的對(duì)象,故其具備運(yùn)行時(shí)特性。

    14. iOS設(shè)備性能測(cè)試

    在實(shí)際開發(fā)中,我們經(jīng)常需要對(duì)應(yīng)用瘦身,因此對(duì)性能的檢測(cè)是很重要的。

    參考答案:
    使用Profile-> Instruments ->Time Profiler可以檢測(cè)性能。

    15. Objective-C中有私有方法、私有變量么?

    我記得曾經(jīng)我就被這么問(wèn)過(guò),不知道大家有沒有遇到過(guò)。

    參考答案:

    在類的.m實(shí)現(xiàn)文件內(nèi)聲明,就可以作為私有方法、私有變量。但是,并不是絕對(duì)的私有,如果外部知道有這么個(gè)方法,一樣可以調(diào)用,而且不會(huì)報(bào)錯(cuò)。就像蘋果公司沒有公開出來(lái)的API,只要我們通過(guò)其它方式了解到api就可以調(diào)用。于是蘋果審核時(shí)經(jīng)常由于使用了私有api而打回來(lái)了。

    16. 簡(jiǎn)述tableview的重用機(jī)制

    曾經(jīng)筆者面試時(shí),也被問(wèn)到這個(gè)問(wèn)題。

    參考答案:?
    [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]

    ?這個(gè)方法就是重用機(jī)制的核心了。比如,有一個(gè)界面可顯示10個(gè)cell,那么創(chuàng)建10次cell,并給cell指定同樣的重用標(biāo)識(shí)(當(dāng)然,可以為不同顯示類型的cell指定不同的標(biāo)識(shí))并且10個(gè)cell將全部都加入到visiableCells數(shù)組,reusableTableCells為空.

    滾動(dòng)tableView,當(dāng)有一個(gè)cell完全移出屏幕時(shí),這個(gè)cell就會(huì)被加入到reusableTableCells。而新出現(xiàn)的那個(gè)cell將加入到visiableCells,而這個(gè)cell就是被重用的。
    如果要讓tableview不重用,不設(shè)置reuseIdentifier就可以了。

    17. nil與NULL的區(qū)別

    參考答案:

    nil和C語(yǔ)言的NULL相同,在objc/objc.h中定義。nil表示Objective-C對(duì)象的值為空。在C語(yǔ)言中,指針的空值用NULL表示。在Objective-C中,nil對(duì)象調(diào)用任何方法表示什么也不執(zhí)行,也不會(huì)崩潰。

    18. Category是什么,何時(shí)使用?

    參考答案:

    Category就是所謂的擴(kuò)展。

    有時(shí)我們需要在一個(gè)已經(jīng)定義好的類中增加一些方法,而不想去重寫該類,這時(shí)候使用擴(kuò)展就很好。比如,當(dāng)工程已經(jīng)很大,代碼量比較多,或者類中已經(jīng)有很多方法,已經(jīng)有其他代碼調(diào)用了該類創(chuàng)建對(duì)象并使用該類的方法時(shí),可以使用類別對(duì)該類擴(kuò)充新的方法。

    筆者所到公司之處,都會(huì)根據(jù)公司的UI風(fēng)格定制一套UI組件,統(tǒng)一全局的風(fēng)格。本人向來(lái)不喜歡用xib/storyboard開發(fā),因?yàn)榫S護(hù)成本太高了。我們不能通過(guò)繼承的方式定制各種組件吧?所以這個(gè)時(shí)候使用擴(kuò)展是最佳時(shí)期.

    19. 什么是Delegate?常用場(chǎng)景?

    參考答案:

    Delegate就是所謂的代理,代理是一種設(shè)計(jì)模式。在iOS開發(fā)中,會(huì)使用到大量的代理,而代理設(shè)計(jì)模式是蘋果中的標(biāo)準(zhǔn)設(shè)置模式。

    常用場(chǎng)景有反向傳值。比如:蘋果的藍(lán)牙,我們進(jìn)入到下一個(gè)界面去打開或者關(guān)閉藍(lán)牙,當(dāng)操作之后需要將狀態(tài)反饋到前一個(gè)界面,并更新顯示。對(duì)于這種狀態(tài),使用代理設(shè)計(jì)模式是很標(biāo)準(zhǔn)的模式。

    20. 什么是單例,如何設(shè)計(jì)單例?

    參考答案:

    單例就是全局都只有一個(gè)對(duì)象存在,而且是在整個(gè)App運(yùn)行過(guò)程中都存在。每個(gè)App都會(huì)有單例,比如UIApplication。而我們?cè)谧鲇脩魯?shù)據(jù)存儲(chǔ)時(shí),通常都會(huì)用單例存儲(chǔ),因?yàn)閼?yīng)用在所有操作中,經(jīng)常要求先登錄。

    下面這種寫法是最常用的寫法,這個(gè)是線程安全的。

    + (instancetype)shared {
    ? static HYBUserManager *sg_userManager = nil;
    ? static dispatch_once_t onceToken;
    ? dispatch_once(&onceToken, ^{
    ? ? if (sg_userManager == nil) {
    ? ? ? sg_userManager = [[HYBUserManager alloc] init];
    ? ? }
    ? });
    ? return sg_userManager;
    }

    21. 什么是通知?

    參考答案:

    在iOS中,通知是非常常用的設(shè)計(jì)模式。它是多對(duì)多的關(guān)系。關(guān)于通知,由于這一節(jié)比較重要,單獨(dú)寫成一篇文章,后續(xù)發(fā)出!
    主站蜘蛛池模板: 亚洲AV无码专区国产乱码不卡| 无码精品久久久天天影视| 亚洲AV成人片无码网站| 国产成人无码A区在线观看导航| 无码丰满熟妇一区二区| 国产成人无码AV一区二区 | 精品无码久久久久久久久水蜜桃| 黄色成人网站免费无码av| 最新国产精品无码| 中文有码无码人妻在线| 亚洲AV无码一区东京热久久| 无码狠狠躁久久久久久久| 亚洲VA中文字幕无码一二三区| 国产乱人伦中文无无码视频试看| 国产爆乳无码视频在线观看| 在线无码视频观看草草视频| 曰产无码久久久久久精品| 亚洲av无码一区二区三区网站| 小泽玛丽无码视频一区| 亚洲av永久无码嘿嘿嘿| 无码国产精品一区二区免费模式| 18禁超污无遮挡无码免费网站国产| 日韩精品无码熟人妻视频| 国产强伦姧在线观看无码| 岛国av无码免费无禁网站| 乱人伦中文无码视频在线观看 | 亚洲精品无码久久久影院相关影片| 亚洲国产精品无码久久| 久久久无码精品亚洲日韩蜜臀浪潮 | 亚洲AV蜜桃永久无码精品| 无码人妻一区二区三区免费| 色综合久久久久无码专区| 亚洲国产精品成人精品无码区 | 国产品无码一区二区三区在线| 精品国产一区二区三区无码| 久久久久亚洲AV片无码下载蜜桃| 久久久久亚洲Av片无码v| 亚洲综合无码一区二区三区| av大片在线无码免费| 亚洲国产精品无码久久九九大片 | 中文有码无码人妻在线|