iOS基礎(chǔ)問(wèn)題面試題附帶答案(一)

1.簡(jiǎn)單的描述下類擴(kuò)展和分類的區(qū)別?(說(shuō)2點(diǎn))

類擴(kuò)展沒(méi)有名字,分類有名字。
類擴(kuò)展可以為某個(gè)類增加額外的屬性、成員變量、方法聲明;分類只能擴(kuò)充方法,不能擴(kuò)充成員變量,如果在分類中聲明了一個(gè)屬性,分類只會(huì)生成這個(gè)屬性的get\set方法聲明。

2.簡(jiǎn)要的說(shuō)明UIView的frame和bounds的區(qū)別。

frame表示的是控件矩形框在父控件中的位置和尺寸,是以父控件的左上角為坐標(biāo)原點(diǎn).
bounds表示的是控件矩形框的位置和尺寸,是以自己的左上角為坐標(biāo)原點(diǎn).

3.什么是控制器

凡是繼承自UIViewController的對(duì)象都是控制器.

4.簡(jiǎn)單的描述控制器的作用

負(fù)責(zé)處理軟件界面的各種事件,并負(fù)責(zé)軟件界面的創(chuàng)建和銷毀.

5.簡(jiǎn)單的描述下storyboard的作用

用來(lái)描述描述軟件界面的.

6.簡(jiǎn)述程序的啟動(dòng)原理

程序一啟動(dòng),就會(huì)加載Main.storyboard文件;會(huì)創(chuàng)建箭頭所指的控制器,并顯示控制器所管理的軟件界面

7.IBOutLet有什么作用

被IBOutlet修飾的屬性能拖線到storyboard中,而且只能修飾屬性.

8.IBAction有什么作用

被IBAction修飾的方法能拖線到storyboard中,只能修飾方法返回值類型

9.IBAction和IBOutLet前綴IB是什么意思

IB全稱:Interface Builder,從Xcode4開始,Interface Builder已經(jīng)整合到Xcode中

10.簡(jiǎn)單描述父子控件

每個(gè)控件都是個(gè)容器,能容納其他控件;內(nèi)部小控件是大控件的子控件;大控件是內(nèi)部小控件的父控件

11. 解釋下引用資源的時(shí)候每個(gè)選項(xiàng)的含義

copy:勾選copy,會(huì)把資源拷貝一份到項(xiàng)目的文件夾中(建議勾選,因?yàn)檫@樣修改項(xiàng)目中的資源不會(huì)影響源資源)
Added folder:如果勾選Create groups,只會(huì)會(huì)創(chuàng)建一個(gè)虛擬的文件夾,程序打包后,安裝包中不存在這個(gè)文件夾;如果勾選Create folder references,真的創(chuàng)建一個(gè)文件夾,程序打包后,安裝包中真的有這個(gè)文件夾.
Add to targets:要不要把資源打包到軟件安裝包中去.一定要勾選,不勾選到時(shí)候程序打包后,安裝包中沒(méi)有這個(gè)資源.

12.UILabel如何設(shè)置自動(dòng)換行

設(shè)置numberOflines 為0.

13.Character Wrap和Word Wrap的區(qū)別

Character Wrap 字符包裹;
Word Wrap 單詞包裹<保證單詞的完整性>.

14.contentMode的作用

內(nèi)容模式: 一般用來(lái)控制圖片如何顯示

15.initWithImage:的作用?

根據(jù)傳入的圖片對(duì)象創(chuàng)建UIImageView對(duì)象;并且UIImageView的尺寸默認(rèn)等于圖片的尺寸

16.如何修改一個(gè)控件的frame屬性?

直接使用CGRectMake函數(shù)
利用臨時(shí)結(jié)構(gòu)體變量
直接運(yùn)用結(jié)構(gòu)體賦值

17.如何抽方法?

先把相同的代碼抽到方法中
把要變化的東西換成變量,然后編譯,把報(bào)錯(cuò)的設(shè)置為方法的參數(shù)

18.通過(guò)imageNamed:這個(gè)方法加載圖片有什么特點(diǎn)?

有緩存
UIImage *image =[UIImage imageNamed:@"圖片名"]
使用場(chǎng)合:圖片比較小、使用頻率比較高
建議:把需要緩存的圖片放到Images.xcassets

19.開發(fā)如何選擇UILabel,UIImageView,UIButton

能用UILabel,UIImageView的盡量用UILabel,UIImageView;需要和用戶交互用UIButton

20.什么是自定義控件

繼承自系統(tǒng)的控件寫一個(gè)自己的控件,目的是封裝控件內(nèi)部的細(xì)節(jié)

21.通過(guò)代碼如何自定義控件? 并且簡(jiǎn)單的描述下每一個(gè)步驟的理由?

新建一個(gè)繼承UIView的類,(所謂自定義控件就是繼承系統(tǒng)自帶的控件寫一個(gè)自己的控件)
在initWithFrame方法中添加子控件(保證別人在外面不管是通過(guò)init還是initWithFrame創(chuàng)建都能夠添加子控件,因?yàn)閕nit方法內(nèi)部會(huì)調(diào)用initWithFrame
在layoutSubViews方法中設(shè)置子控件的frame(因?yàn)樵贗nitWithFrame方法中當(dāng)前控件尺寸可能沒(méi)值,所以計(jì)算不了子控件的位置和尺寸,而在layoutSubViews方法,能夠拿到當(dāng)前控件的尺寸)
提供一個(gè)模型屬性,重寫模型屬性的set方法(保證在別人在設(shè)置數(shù)據(jù)的那一刻就可以拿到數(shù)據(jù)設(shè)置到對(duì)應(yīng)的子控件上)

22.什么是模型

概念:專門用來(lái)存放數(shù)據(jù)的對(duì)象
特點(diǎn):一般繼承NSObject,在.h文件中聲明一些用來(lái)存放數(shù)據(jù)的屬性

23.通過(guò)XIB如何自定義控件? 并且簡(jiǎn)單的描述下每一個(gè)步驟的理由?

新建一個(gè)繼承UIView的類,(所謂自定義控件就是繼承系統(tǒng)自帶的控件寫一個(gè)自己的控件)
新建一個(gè)xib文件(xib的文件名最好和類名一樣)
修改最外面那個(gè)控件的class為控件類名(只有修改類名,當(dāng)時(shí)候從xib中出來(lái)的才是我這種類型的控件)
提供一個(gè)模型屬性,重寫模型屬性的set方法(保證在別人在設(shè)置數(shù)據(jù)的那一刻就可以拿到數(shù)據(jù)設(shè)置到對(duì)應(yīng)的子控件上)

24.instancetype和id的區(qū)別

都可以代表任意類型
instancetype只能作為返回值
id類型可以作為返回值,也可以作為參數(shù),也可以定義變量
instancetype會(huì)類型檢測(cè),id不會(huì)進(jìn)行類型檢測(cè)

25. @property的使用策略

assign:'基本數(shù)據(jù)類型'、’枚舉‘、’結(jié)構(gòu)體‘等非OC對(duì)象
weak:OC對(duì)象類型(比如NSArray、NSDate、NSNumber、模型類)
strong:OC對(duì)象類型(比如NSArray、NSDate、NSNumber、模型類)
一個(gè)對(duì)象只要有強(qiáng)指針引用,就不會(huì)被銷毀

26.懶加載的好處?

用到時(shí)再加載,只會(huì)加載一次

27.如果是通過(guò)xib或者storyboard創(chuàng)建控件,初始化的操作可以在initWithFrame:方法中做嗎?

如果是通過(guò)xib或者storyboard創(chuàng)建控件,初始化時(shí)是不會(huì)調(diào)用initWithFrame,會(huì)調(diào)用initWithCoder.初始化完畢會(huì)調(diào)用awakeFromNib方法,建議在awakeFromNib中做初始化

28.通過(guò)alloc/init或者alloc/initWithFrame創(chuàng)建控件會(huì)不會(huì)主動(dòng)加載xib?

通過(guò)alloc/init或者alloc/initWithFrame創(chuàng)建控件不會(huì)主動(dòng)加載xib,即使xib的名稱和控件的類名一樣

29.用一個(gè)屬性引用UI控件的時(shí)候?yàn)槭裁纯梢杂脀eak?

因?yàn)閁I控件添加到父控件中以后,會(huì)有強(qiáng)指針指向這個(gè)對(duì)象,就應(yīng)經(jīng)可以保證這個(gè)對(duì)象不會(huì)被銷毀.在搞一個(gè)屬性引用這個(gè)對(duì)象,用弱引用就可以.

30.如何隱藏一個(gè)控件?

設(shè)置hidden為YES;
設(shè)置alpha為0.0.

31.如何用按鈕來(lái)實(shí)現(xiàn)圖片上文字下的效果?

自定義按鈕,實(shí)現(xiàn)
-(CGRect)titleRectForContentRect:(CGRect)contentRect
{
// 返回文字的frame
}
-  (CGRect)imageRectForContentRect:(CGRect)contentRect
{
// 返回圖片的frame
}
 
- 自定義按鈕,實(shí)現(xiàn)layoutSubViews方法調(diào)整按鈕內(nèi)部子控件的位置和尺寸

32.通過(guò)代碼如何設(shè)置的內(nèi)邊距?

self.btn.contentEdgeInsets = UIEdgeInsetsMake(30, 30, 0, 0);
self.btn.titleEdgeInsets = UIEdgeInsetsMake(0, -30, 0, 0);
self.btn.imageEdgeInsets = UIEdgeInsetsMake(0, -30, 0, 0);

33.如何處理圖片拉伸問(wèn)題?

創(chuàng)建可拉伸的圖片對(duì)象
 
bg = [bg resizableImageWithCapInsets:UIEdgeInsetsMake(10,10,10,10) resizingMode:..];//平鋪和拉伸
 
UIImage *bg = ...

34.在xcode中如何配置拉伸圖片?

選中圖片--->右邊(Slicing)-->Sices:Horizontal and Vertical -->上下左右設(shè)置

35.KVC的作用?

Key Value Coding 鍵值編碼,可以修改屬性的值,并且可以修改私有的成員比變量;可以取值

36.如何監(jiān)聽scrollView停止?jié)L動(dòng)?

設(shè)置scrollView的代理
代理對(duì)象遵守<UIScrollViewDelegate>協(xié)議
實(shí)現(xiàn)協(xié)議里面

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
 
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

37.定時(shí)器一般有什么作用?以及如何使用定時(shí)器

可以辦到每隔一定的時(shí)間做一件事件.
通過(guò)

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;

可以創(chuàng)建一個(gè)自定執(zhí)行任務(wù)的定時(shí)器對(duì)象
通過(guò) - (void)invalidate這個(gè)方法可以停止定時(shí)器

38.scrollView的使用場(chǎng)景

當(dāng)內(nèi)容數(shù)據(jù)一多,在可視的View中就展示不完,這時(shí)候就需要用到UIScrollView控件.

39.UIScrollView無(wú)法滾動(dòng)的原因

沒(méi)有設(shè)置contentSize,或者設(shè)置的contenSize小于等于scrollView的尺寸
scrollEnable = NO;
userInteractionEnable = NO; // 是否允許與用戶交互

40.scrollEnable和userInteractionEnable的區(qū)別

scrollEnable僅僅是不能滾動(dòng),其他事件依舊能夠響應(yīng)
userInteractionEnable禁止任何交互事件

41.alwaysBounceVertical alwaysBounceHorizontal的作用

不管有沒(méi)有contentSize,總是有彈簧效果;作用:用來(lái)做下拉刷新和上拉刷新的

42.如何監(jiān)聽UIScrollView各種行為

設(shè)置scrollView的delegate(代理)為控制器對(duì)象
控制器要遵守協(xié)議UIScrollViewDelegate協(xié)議
控制器要實(shí)現(xiàn)UIScrollViewDelegate協(xié)議里面的方法

43.代理的注意點(diǎn)

scrollView的代理可以是任何類型的OC 對(duì)象
代理一定是weak

44.利用UIScrollView如何實(shí)現(xiàn)內(nèi)容縮放

設(shè)置代理
實(shí)現(xiàn)代理方法
-(UIView *)viewForZoomingInScrollview:(UIScrollView *)scrollView;
設(shè)置縮放比例

self.scrollView.maximumZoomScale = 2.0;
self.scrollView.minimumZoomScale = 0.2;

45.如何監(jiān)聽控件的行為?

通過(guò)addTarget:
只有繼承來(lái)自UICotrol的對(duì)象,才有這個(gè)功能
通過(guò)delegate:
只有擁有delegate屬性的控件,才有這個(gè)功能

46.通過(guò)autolayout如何實(shí)現(xiàn)UILabel包裹內(nèi)容?

設(shè)置位置約束
設(shè)置寬度約束<=固定值
不需要設(shè)置高度約束

47.什么是適配?

適應(yīng)、兼容各種不同的情況
系統(tǒng)適配:針對(duì)不同版本的操作系統(tǒng)進(jìn)行適配
屏幕適配:針對(duì)不同大小的屏幕尺寸進(jìn)行適配

48.點(diǎn)和像素的區(qū)別

在用戶眼中,屏幕是由無(wú)數(shù)個(gè)像素組成的,像素越多,屏幕越清晰
在開發(fā)者眼中,屏幕是由無(wú)數(shù)個(gè)點(diǎn)組成的,點(diǎn)又是由像素組成的,一個(gè)點(diǎn)鐘包含的像素越多,屏幕越清晰.

49.什么是Autolayout?

Autolayout是一種“自動(dòng)布局”技術(shù),專門用來(lái)布局UI界面的

50.簡(jiǎn)單描述下Autolayout的2個(gè)核心概念約束和參照

約束:通過(guò)給控件添加約束,來(lái)決定控件的位置和尺寸
參照:在添加約束時(shí),是依照誰(shuí)來(lái)添加(可以是父控件或者兄弟控件)

51.Autolayout的警告和錯(cuò)誤

警告:控件的frame不匹配所添加的約束
錯(cuò)誤:1>缺乏必要的約束;2>兩個(gè)約束沖突

52.通過(guò)代碼添加約束的原則

對(duì)于兩個(gè)同層級(jí)view之間的約束關(guān)系,添加到它們的父view上
對(duì)于兩個(gè)不同層級(jí)view之間的約束關(guān)系,添加到他們最近的共同父view上
對(duì)于有層次關(guān)系的兩個(gè)view之間的約束關(guān)系,添加到層次較高的父view上

53.什么是VFL

VFL全稱是Visual Format Language,翻譯過(guò)來(lái)是“可視化格式語(yǔ)言”
VFL是蘋果公司為了簡(jiǎn)化Autolayout的編碼而推出的抽象語(yǔ)言

54.通過(guò)約束如何實(shí)現(xiàn)動(dòng)畫

在修改了約束之后,只要執(zhí)行下面代碼,就能做動(dòng)畫效果

[UIView animateWithDuration:1.0 animations:^{
 
[添加了約束的view的父控件 layoutIfNeeded];
 
}];

55.性能優(yōu)化的具體實(shí)現(xiàn)

當(dāng)滾動(dòng)列表時(shí),部分UITableViewCell會(huì)移出窗口,UITableView會(huì)將窗口外的UITableViewCell放入一個(gè)對(duì)象池中,等待重用。
當(dāng)UITableView要求dataSource返回UITableViewCell時(shí),dataSource會(huì)先查看這個(gè)對(duì)象池,如果池中有未使用的UITableViewCell,dataSource會(huì)用新的數(shù)據(jù)配置這個(gè)UITableViewCell,然后返回給UITableView,重新顯示到窗口中,從而避免創(chuàng)建新對(duì)象.

56.UITableView如何展示數(shù)據(jù)?

1、設(shè)置數(shù)據(jù)源對(duì)象self.tableView.dataSource = self;
2、數(shù)據(jù)源對(duì)象要遵守協(xié)議
3、實(shí)現(xiàn)數(shù)據(jù)源方法

// 多少組數(shù)據(jù)
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
 
// 每一組有多少行數(shù)據(jù)
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
 
// 每一行顯示什么內(nèi)容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

57.UITableView的有哪幾種樣式

UITableViewStylePlain
UITableViewStyleGrouped

58.UITableViewController的認(rèn)識(shí)

tableVieController有個(gè)tableView屬性,指向一個(gè)tableView,而tableView的dataSource和delegate屬性指向就是這個(gè)控制器.并且這個(gè)控制器已經(jīng)遵守了UITableViewDataSource和UITableViewDelegate協(xié)議.而每個(gè)控制器的內(nèi)部都有一個(gè)view屬性,在tableVieController中,view和tableView屬性指向的是同一個(gè)對(duì)象.

59.性能優(yōu)化的思路

iOS設(shè)備的內(nèi)存有限,如果用UITableView顯示成千上萬(wàn)條數(shù)據(jù),就需要成千上萬(wàn)個(gè)UITableViewCell對(duì)象的話,那將會(huì)耗盡iOS設(shè)備的內(nèi)存。要解決該問(wèn)題,需要重用UITableViewCell對(duì)象

60.UITableView的性能優(yōu)化的實(shí)現(xiàn)步驟

/**  每當(dāng)一個(gè)cell要進(jìn)入視野范圍就會(huì)調(diào)用這個(gè)方法 */
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
 
// 1.定義一個(gè)重用標(biāo)識(shí)
static NSString *ID = @"tim";
 
// 2.去緩存池取可循環(huán)利用的cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
 
// 3.緩存池如果沒(méi)有可循環(huán)利用的cell,自己創(chuàng)建
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
// 建議:所有cell都一樣的設(shè)置,寫在這個(gè)大括號(hào)中;所有cell不都一樣的設(shè)置寫在外面
cell.backgroundColor = [UIColor redColor];
 
}
// 4.設(shè)置數(shù)據(jù)
cell.textLabel.text = [NSString stringWithFormat:@"第%zd行數(shù)據(jù)",indexPath.row];
 
return cell;
}

61.registerClass:的作用

根據(jù)一個(gè)ID注冊(cè)這個(gè)ID標(biāo)識(shí)對(duì)應(yīng)的cell類型.

62.通過(guò)注冊(cè)的方法如何實(shí)現(xiàn)cell的重用

NSString *ID = @"wine";
- (void)viewDidLoad {
[super viewDidLoad];
// 注冊(cè)ID 這個(gè)標(biāo)識(shí)對(duì)應(yīng)的cell類型為UITableViewCell
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:ID];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// 1.先去緩存池中查找可循環(huán)利用的cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
 
// 2.設(shè)置數(shù)據(jù)
cell.textLabel.text = [NSString stringWithFormat:@"%zd行的數(shù)據(jù)", indexPath.row];
 
return cell;
}

63.如何監(jiān)聽tableView內(nèi)部cell的點(diǎn)擊事件

1、設(shè)置代理
2、代理對(duì)象遵守協(xié)議
3、實(shí)現(xiàn)協(xié)議里面的方法

64.簡(jiǎn)述[crayon-5896e1476e7ef931474791-i/] 和[crayon-5896e1476e7f3900013126-i/] 這2個(gè)方法的區(qū)別

registerClass這個(gè)方法是根據(jù)ID 注冊(cè)對(duì)應(yīng)的cell類型,系統(tǒng)創(chuàng)建cell的方式是通過(guò)alloc/initWithStyle...
registerNib 這個(gè)方法是根據(jù)ID 注冊(cè)一個(gè)xib文件,系統(tǒng)創(chuàng)建cell的方式是通過(guò)加載xib文件.

65.如何計(jì)算一段文字的寬度和高度?

第一種情況:如果label只有一行,通過(guò)sizeWithAttributes:這個(gè)方法,告知這段文字的字體和字體大小就可以計(jì)算這段文字的尺寸.
第二種情況:如果label需要換行計(jì)算高度,通過(guò)boundingRectWithSize: options: attributes:attributes context: 這個(gè)方法,告知這段文字的字體和字體大小,并且在一個(gè)限制的尺寸內(nèi)計(jì)算這段文字的尺寸.

66.什么是自定義cell?

繼承自系統(tǒng)的UITableViewCell寫一個(gè)自己的cell

67.通過(guò)代碼自定義cell能在ininWithFrame:方法中添加子控件嗎?

不能,自定義cell 是在initWithStyle:reuseIdentifier:方法添加子控件

68.通過(guò)代碼自定義cell能在initWithStyle:reuseIdentifier:方法中計(jì)算子控件的位置和尺寸嗎?

不行,因?yàn)樵谶@個(gè)方法,cell的尺寸可能還沒(méi)有,而計(jì)算子控件的位置和尺寸需要相對(duì)于cell來(lái)計(jì)算.通過(guò)代碼自定義cell是在layoutSubviews中計(jì)算的

69.通過(guò)代碼自定義cell,frame和Autolayout2中的方式有什么區(qū)別?

這2種方法,只是子控件的位置和尺寸的確定方法不一樣.frame是通過(guò)設(shè)置子控件的frame來(lái)確定;而Autolayout是通過(guò)添加約束的方式來(lái)確定

70.通過(guò)storyboard的方式是如何加載cell

首先根據(jù)ID去緩存池中取,如果緩存中沒(méi)有,也沒(méi)有注冊(cè),會(huì)自動(dòng)去storyboard中找有沒(méi)有ID這種標(biāo)識(shí)的Cell,如果有,會(huì)加載這個(gè)cell,并且綁定這個(gè)標(biāo)識(shí)返回

71.字典轉(zhuǎn)模型第三方框架的了解

Mantle:所有模型都必須繼承自MTModel
JSONModel:所有模型都必須繼承自JSONModel
MJExtension:不需要強(qiáng)制繼承任何其他類

72.設(shè)計(jì)框架需要考慮的問(wèn)題

侵入性:侵入性大就意味著很難離開這個(gè)框架
易用性:比如少量代碼實(shí)現(xiàn)N多功能
擴(kuò)展性:很容易給這個(gè)框架增加新功能

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容