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

1.簡單的描述下類擴展和分類的區(qū)別?(說2點)

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

2.簡要的說明UIView的frame和bounds的區(qū)別。

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

3.什么是控制器

凡是繼承自UIViewController的對象都是控制器.

4.簡單的描述控制器的作用

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

5.簡單的描述下storyboard的作用

用來描述描述軟件界面的.

6.簡述程序的啟動原理

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

7.IBOutLet有什么作用

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

8.IBAction有什么作用

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

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

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

10.簡單描述父子控件

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

11. 解釋下引用資源的時候每個選項的含義

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

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

設(shè)置numberOflines 為0.

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

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

14.contentMode的作用

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

15.initWithImage:的作用?

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

16.如何修改一個控件的frame屬性?

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

17.如何抽方法?

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

18.通過imageNamed:這個方法加載圖片有什么特點?

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

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

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

20.什么是自定義控件

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

21.通過代碼如何自定義控件? 并且簡單的描述下每一個步驟的理由?

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

22.什么是模型

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

23.通過XIB如何自定義控件? 并且簡單的描述下每一個步驟的理由?

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

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

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

25. @property的使用策略

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

26.懶加載的好處?

用到時再加載,只會加載一次

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

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

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

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

29.用一個屬性引用UI控件的時候為什么可以用weak?

因為UI控件添加到父控件中以后,會有強指針指向這個對象,就應(yīng)經(jīng)可以保證這個對象不會被銷毀.在搞一個屬性引用這個對象,用弱引用就可以.

30.如何隱藏一個控件?

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

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

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

32.通過代碼如何設(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.如何處理圖片拉伸問題?

創(chuàng)建可拉伸的圖片對象
 
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動?

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

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

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

可以辦到每隔一定的時間做一件事件.
通過

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

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

38.scrollView的使用場景

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

39.UIScrollView無法滾動的原因

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

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

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

41.alwaysBounceVertical alwaysBounceHorizontal的作用

不管有沒有contentSize,總是有彈簧效果;作用:用來做下拉刷新和上拉刷新的

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

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

43.代理的注意點

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

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

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

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

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

通過addTarget:
只有繼承來自UICotrol的對象,才有這個功能
通過delegate:
只有擁有delegate屬性的控件,才有這個功能

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

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

47.什么是適配?

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

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

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

49.什么是Autolayout?

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

50.簡單描述下Autolayout的2個核心概念約束和參照

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

51.Autolayout的警告和錯誤

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

52.通過代碼添加約束的原則

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

53.什么是VFL

VFL全稱是Visual Format Language,翻譯過來是“可視化格式語言”
VFL是蘋果公司為了簡化Autolayout的編碼而推出的抽象語言

54.通過約束如何實現(xiàn)動畫

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

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

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

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

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

1、設(shè)置數(shù)據(jù)源對象self.tableView.dataSource = self;
2、數(shù)據(jù)源對象要遵守協(xié)議
3、實現(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的認識

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

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

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

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

/**  每當(dāng)一個cell要進入視野范圍就會調(diào)用這個方法 */
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
 
// 1.定義一個重用標(biāo)識
static NSString *ID = @"tim";
 
// 2.去緩存池取可循環(huán)利用的cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
 
// 3.緩存池如果沒有可循環(huán)利用的cell,自己創(chuàng)建
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
// 建議:所有cell都一樣的設(shè)置,寫在這個大括號中;所有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ù)一個ID注冊這個ID標(biāo)識對應(yīng)的cell類型.

62.通過注冊的方法如何實現(xiàn)cell的重用

NSString *ID = @"wine";
- (void)viewDidLoad {
[super viewDidLoad];
// 注冊ID 這個標(biāo)識對應(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的點擊事件

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

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

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

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

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

66.什么是自定義cell?

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

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

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

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

不行,因為在這個方法,cell的尺寸可能還沒有,而計算子控件的位置和尺寸需要相對于cell來計算.通過代碼自定義cell是在layoutSubviews中計算的

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

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

70.通過storyboard的方式是如何加載cell

首先根據(jù)ID去緩存池中取,如果緩存中沒有,也沒有注冊,會自動去storyboard中找有沒有ID這種標(biāo)識的Cell,如果有,會加載這個cell,并且綁定這個標(biāo)識返回

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

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

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,119評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,382評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,038評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,853評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,616評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,112評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,192評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,355評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,869評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,727評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,928評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,467評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,165評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,570評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,813評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,585評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,892評論 2 372

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