欧美性性性性性色大片免费的,诱人小峓子5中字巴巴鱼汤饭,绿帽娇妻肚子被灌满精怀孕,品酒要在成为夫妻后

好獵頭網(wǎng)-中高級人才獵頭網(wǎng)站!服務(wù)熱線:400-1801-668 好獵頭   |   登錄 注冊

iOS工程師面試筆試題

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

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

參考答案:

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

2. @class的作用

參考答案:

@class一般用于頭文件中通過前向聲明,就可以聲明了,但是在.m文件中還是需要使用#import進來的。它的作用只是前向聲明。

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

參考答案:

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

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

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

參考答案:

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

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

參考答案:

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

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

參考答案:

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

7. objective-c中的可變與不可變詞典

參考答案:

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

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

參考答案:?

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

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

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

9. 自動生成getter/setter方法

參考答案:

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

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

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

10. 什么是MVC

參考答案:

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

Model用于處理數(shù)據(jù),通常來說,Model中會包含多個字段,用于存儲數(shù)據(jù)。但是,Model還會有一部分邏輯,比如說:

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

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

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

11. 重寫getter/setter方法

假設(shè)聲明屬性:

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

參考答案:

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

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

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

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


12. obj在編譯時和運行時分別時什么類型的對象

如下面的代碼,obj在編譯時和運行時分別時什么類型的對象:
NSString *obj = [[NSData alloc] init];

參考答案:

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

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

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

13. id聲明的對象有什么特性?

id類型可以指向任何類型的對象。

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

/// 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類型是一個指向objc_object結(jié)構(gòu)體類型的指針,這個結(jié)構(gòu)體只有一個指向?qū)ο鬅o類的指針isa,因此id可以指向任何類型的對象,故其具備運行時特性。

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

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

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

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

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

參考答案:

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

16. 簡述tableview的重用機制

曾經(jīng)筆者面試時,也被問到這個問題。

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

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

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

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

參考答案:

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

18. Category是什么,何時使用?

參考答案:

Category就是所謂的擴展。

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

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

19. 什么是Delegate?常用場景?

參考答案:

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

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

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

參考答案:

單例就是全局都只有一個對象存在,而且是在整個App運行過程中都存在。每個App都會有單例,比如UIApplication。而我們在做用戶數(shù)據(jù)存儲時,通常都會用單例存儲,因為應(yīng)用在所有操作中,經(jīng)常要求先登錄。

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

+ (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è)計模式。它是多對多的關(guān)系。關(guān)于通知,由于這一節(jié)比較重要,單獨寫成一篇文章,后續(xù)發(fā)出!
免费看美女被靠到爽的视频| 全免费a级毛片免费看视频| 国产精品18久久久久久麻辣 | 胸大喂奶h玩弄爽到失禁n| 强壮的公次次弄得我高潮a片日本| 精品成人一区二区三区四区| 国产成人亚洲精品无码| 偷窥学校女厕撒尿bbbbb| 思敏全集1一5正版免费看| 老宋翁熄高潮怀孕| 日本不卡一区二区三区| 总裁晚上含奶h嗯额嗯电影| 久久精品国产大片免费观看| 日本公与熄乱理在线播放| 年轻丰满的继牳4伦理| bbox撕裂bass俄罗斯| 国偷自产一区二区免费视频| 国产欧美va欧美va在线观看| 浓毛妇女老太bbwbbw| 液体收集系统| 中文字字幕在线中文乱码怎么设置| 亚洲精品无码永久在线观看你懂的| 亚洲欧美日本A∨在线观看| 色欲午夜无码久久久久久| 久久久久久久久无码精品亚洲日韩| 大陆极品少妇内射aaaaaa| 少妇高潮喷水久久久久久久久| 日本亲近相奷中文字幕| 午夜性爽视频男人的天堂| 美女视频黄是免费| 亚洲精品久久久久久| b站直播入口| 杂交bucsm人类ssba| 挺进寡妇妇紧窄湿润| 国产人久久人人人人爽| 日本高清一区二区三区| 制服丝袜中文字幕在线| 最近最新高清中文字幕| 狠狠综合久久av一区二区| 地址一地址二地址三| 丁香五香天堂网|