iOS基礎問答面試題連載(一)-附答案

來源:互聯網
上載者:User

標籤:建立   cot   方便   git   nsarray   oms   擴充性   self   螢幕適配   

「Tim的部落格」iOS基礎問答面試題連載(一)-附答案

「Tim的部落格」iOS基礎問答面試題連載(二)-附答案

「Tim的部落格」iOS基礎問答面試題連載(三)-附答案

「Tim的部落格」iOS基礎問答面試題連載(四)

以下是一些自己收集的比較基礎的問題(大神可以忽略),附上答案,方便大家閱讀。俗話說得好,基礎不牢,地動山搖。文章末尾會提供PDF版的文檔,方便大家木有網的時候也可以用行動裝置觀看。

 

1.簡單的描述下類擴充和分類的區別?(說2點)
  • 類擴充沒有名字,分類有名字。
  • 類擴充可以為某個類增加額外的屬性、成員變數、方法聲明;分類只能擴充方法,不能擴充成員變數,如果在分類中聲明了一個屬性,分類只會產生這個屬性的get\set方法聲明。

 

2.簡要的說明UIView的frame和bounds的區別。
  • frame表示的是控制項矩形框在父控制項中的位置和尺寸,是以父控制項的左上方為座標原點.
  • bounds表示的是控制項矩形框的位置和尺寸,是以自己的左上方為座標原點.

 

3.什麼是控制器
  • 凡是繼承自UIViewController的對象都是控制器.

 

4.簡單的描述控制器的作用
  • 負責處理軟體介面的各種事件,並負責軟體介面的建立和銷毀.

 

5.簡單的描述下storyboard的作用
  • 用來描述描述軟體介面的.

 

6.簡述程式的啟動原理
  • 程式一啟動,就會載入Main.storyboard檔案;會建立箭頭所指的控制器,並顯示控制器所管理的軟體介面

 

7.IBOutLet有什麼作用
  • 被IBOutlet修飾的屬效能拖線到storyboard中,而且只能修飾屬性.

 

8.IBAction有什麼作用
  • 被IBAction修飾的方法能拖線到storyboard中,只能修飾方法傳回值類型

 

9.IBAction和IBOutLet首碼IB是什麼意思
  • IB全稱:Interface Builder,從Xcode4開始,Interface Builder已經整合到Xcode中

 

10.簡單描述父子控制項
  • 每個控制項都是個容器,能容納其他控制項;內部小控制項是大控制項的子控制項;大控制項是內部小控制項的父控制項

 

 11. 解釋下引用資源的時候每個選項的含義
  • copy:勾選copy,會把資源拷貝一份到項目的檔案夾中(建議勾選,因為這樣修改項目中的資源不會影響源資源)
  • Added folder:如果勾選Create groups,只會會建立一個虛擬檔案夾,程式打包後,安裝包中不存在這個檔案夾;如果勾選Create folder references,真的建立一個檔案夾,程式打包後,安裝包中真的有這個檔案夾.
  • Add to targets:要不要把資源打包到軟體安裝包中去.一定要勾選,不勾選到時候程式打包後,安裝包中沒有這個資源.

 

12.UILabel如何設定自動換行
  • 設定numberOflines 為0.
13.Character Wrap和Word Wrap的區別
  • Character Wrap 字元包裹;
  • Word Wrap 單詞包裹<保證單詞的完整性>.

 

14.contentMode的作用
  • 內容模式: 一般用來控製圖片如何顯示

 

 

15.initWithImage:的作用?
  • 根據傳入的圖片對象建立UIImageView對象;並且UIImageView的尺寸預設等於圖片的尺寸

 

16.如何修改一個控制項的frame屬性?
  1. 直接使用CGRectMake函數
  2. 利用臨時結構體變數
  3. 直接運用結構體賦值

 

17.如何抽方法?
  • 先把相同的代碼抽到方法中
  • 把要變化的東西換成變數,然後編譯,把報錯的設定為方法的參數

 

18.通過imageNamed:這個方法載入圖片有什麼特點?
  • 有緩衝

UIImage *image =[UIImage imageNamed:@"圖片名"]

  • 使用場合:圖片比較小、使用頻率比較高
  • 建議:把需要緩衝的圖片放到Images.xcassets

 

19.開發如何選擇UILabel,UIImageView,UIButton
  • 能用UILabel,UIImageView的盡量用UILabel,UIImageView;需要和使用者互動用UIButton

 

 

20.什麼是自訂控制項
  • 繼承自系統的控制項寫一個自己的控制項,目的是封裝控制項內部的細節
21.通過代碼如何自訂控制項? 並且簡單的描述下每一個步驟的理由?
  • 建立一個繼承UIView的類,(所謂自訂控制項就是繼承系統內建的控制項寫一個自己的控制項)
  • 在initWithFrame方法中添加子控制項(保證別人在外面不管是通過init還是initWithFrame建立都能夠添加子控制項,因為init方法內部會調用initWithFrame
  • 在layoutSubViews方法中設定子控制項的frame(因為在InitWithFrame方法中當前控制項尺寸可能沒值,所以計算不了子控制項的位置和尺寸,而在layoutSubViews方法,能夠拿到當前控制項的尺寸)
  • 提供一個模型屬性,重寫模型屬性的set方法(保證在別人在設定資料的那一刻就可以拿到資料設定到對應的子控制項上)
22.什麼是模型
  • 概念:專門用來存放資料的對象
  • 特點:一般繼承NSObject,在.h檔案中聲明一些用來存放資料的屬性
23.通過XIB如何自訂控制項? 並且簡單的描述下每一個步驟的理由?
  1. 建立一個繼承UIView的類,(所謂自訂控制項就是繼承系統內建的控制項寫一個自己的控制項)
  2. 建立一個xib檔案(xib的檔案名稱最好和類名一樣)
  3. 修改最外面那個控制項的class為控制項類名(只有修改類名,當時候從xib中出來的才是我這種類型的控制項)
  4. 提供一個模型屬性,重寫模型屬性的set方法(保證在別人在設定資料的那一刻就可以拿到資料設定到對應的子控制項上)

 

24.instancetype和id的區別
  • 都可以代表任意類型
  • instancetype只能作為傳回值
  • id類型可以作為傳回值,也可以作為參數,也可以定義變數
  • instancetype會類型檢測,id不會進行類型檢測

 

25. @property的使用原則
  • assign:‘基礎資料型別 (Elementary Data Type)‘、’枚舉‘、’結構體‘等非OC對象
  • weak:OC物件類型(比如NSArray、NSDate、NSNumber、模型類)
  • strong:OC物件類型(比如NSArray、NSDate、NSNumber、模型類)
  • 一個對象只要有強指標引用,就不會被銷毀

 

26.懶載入的好處?
  • 用到時再載入,只會載入一次

 

 

 

27.如果是通過xib或者storyboard建立控制項,初始化的操作可以在initWithFrame:方法中做嗎?
  • 如果是通過xib或者storyboard建立控制項,初始化時是不會調用initWithFrame,會調用initWithCoder.初始化完畢會調用awakeFromNib方法,建議在awakeFromNib中做初始化

 

28.通過alloc/init或者alloc/initWithFrame建立控制項會不會主動載入xib?
  • 通過alloc/init或者alloc/initWithFrame建立控制項不會主動載入xib,即使xib的名稱和控制項的類名一樣
29.用一個屬性引用UI控制項的時候為什麼可以用weak?
  • 因為UI控制項添加到父控制項中以後,會有強指標指向這個對象,就應經可以保證這個對象不會被銷毀.在搞一個屬性引用這個對象,用弱引用就可以.
30.如何隱藏一個控制項?
  • 設定hidden為YES;
  • 設定alpha為0.0.

 

31.如何用按鈕來實現圖片上文字下的效果?
自訂按鈕,實現-(CGRect)titleRectForContentRect:(CGRect)contentRect{// 返迴文字的frame}-  (CGRect)imageRectForContentRect:(CGRect)contentRect{// 返回圖片的frame}- 自訂按鈕,實現layoutSubViews方法調整按鈕內部子控制項的位置和尺寸

 

32.通過代碼如何設定的內邊距?
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.如何處理圖片展開問題?
建立可展開的圖片對象bg = [bg resizableImageWithCapInsets:UIEdgeInsetsMake(10,10,10,10) resizingMode:..];//平鋪和展開UIImage *bg = ...

 

34.在xcode中如何配置展開圖片?
  • 選中圖片--->右邊(Slicing)-->Sices:Horizontal and Vertical -->上下左右設定

 

35.KVC的作用?
  • Key Value Coding 索引值編碼,可以修改屬性的值,並且可以修改私人的成員比變數;可以取值

 

 

36.如何監聽scrollView停止滾動?
  1. 設定scrollView的代理
  2. 代理對象遵守<UIScrollViewDelegate>協議
  3. 實現協議裡面
- (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;

可以建立一個自定執行任務的定時器對象

通過 - (void)invalidate這個方法可以停止定時器

 

38.scrollView的使用情境
  • 當內容資料一多,在可視的View中就展示不完,這時候就需要用到UIScrollView控制項.

 

39.UIScrollView無法滾動的原因
  1. 沒有設定contentSize,或者設定的contenSize小於等於scrollView的尺寸
  2. scrollEnable = NO;
  3. userInteractionEnable = NO; // 是否允許與使用者互動

 

40.scrollEnable和userInteractionEnable的區別
  1. scrollEnable僅僅是不能滾動,其他事件依舊能夠響應
  2. userInteractionEnable禁止任何互動事件

 

41.alwaysBounceVertical alwaysBounceHorizontal的作用
  • 不管有沒有contentSize,總是有彈簧效果;作用:用來做下拉重新整理和上拉重新整理的

 

42.如何監聽UIScrollView各種行為
  1. 設定scrollView的delegate(代理)為控制器對象
  2. 控制器要遵守協議UIScrollViewDelegate協議
  3. 控制器要實現UIScrollViewDelegate協議裡面的方法

 

43.代理的注意點
  1. scrollView的代理可以是任何類型的OC 對象
  2. 代理一定是weak

 

44.利用UIScrollView如何?內容縮放
  1. 設定代理
  2. 實現代理方法
    -(UIView *)viewForZoomingInScrollview:(UIScrollView *)scrollView;
  3. 設定縮放比例
    self.scrollView.maximumZoomScale = 2.0;self.scrollView.minimumZoomScale = 0.2;
45.如何監聽控制項的行為?
  1. 通過addTarget:
    只有繼承來自UICotrol的對象,才有這個功能
  2. 通過delegate:
    只有擁有delegate屬性的控制項,才有這個功能

 

 

46.通過autolayout如何?UILabel包裹內容?
  1. 設定位置約束
  2. 設定寬度約束<=固定值
  3. 不需要設定高度約束

 

47.什麼是適配?
  • 適應、相容各種不同的情況
  • 系統適配:針對不同版本的作業系統進行適配
  • 螢幕適配:針對不同大小的螢幕尺寸進行適配

 

48.點和像素的區別
  • 在使用者眼中,螢幕是由無數個像素組成的,像素越多,螢幕越清晰
  • 在開發人員眼中,螢幕是由無數個點組成的,點又是由像素組成的,一個點鐘包含的像素越多,螢幕越清晰.

 

49.什麼是Autolayout?
  • Autolayout是一種“自動布局”技術,專門用來布局UI介面的

 

50.簡單描述下Autolayout的2個核心概念約束和參照
  • 約束:通過給控制項添加約束,來決定控制項的位置和尺寸
  • 參照:在添加約束時,是依照誰來添加(可以是父控制項或者兄弟控制項)

 

51.Autolayout的警告和錯誤
  • 警告:控制項的frame不匹配所添加的約束
  • 錯誤:1>缺乏必要的約束;2>兩個約束衝突

 

52.通過代碼添加約束的原則
  1. 對於兩個同層級view之間的約束關係,添加到它們的父view上
  2. 對於兩個不同層級view之間的約束關係,添加到他們最近的共同父view上
  3. 對於有層次關係的兩個view之間的約束關係,添加到層次較高的父view上

 

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

 

54.通過約束如何?動畫
  • 在修改了約束之後,只要執行下面代碼,就能做動畫效果
[UIView animateWithDuration:1.0 animations:^{[添加了約束的view的父控制項 layoutIfNeeded];}];

 

 

55.效能最佳化的具體實現
  • 當滾動列表時,部分UITableViewCell會移出視窗,UITableView會將視窗外的UITableViewCell放入一個對象池中,等待重用。
  • 當UITableView要求dataSource返回UITableViewCell時,dataSource會先查看這個對象池,如果池中有未使用的UITableViewCell,dataSource會用新的資料配置這個UITableViewCell,然後返回給UITableView,重新顯示到視窗中,從而避免建立新對象.

 

56.UITableView如何展示資料?
  1. 設定資料來源對象self.tableView.dataSource = self;
  2. 資料來源對象要遵守協議
  3. 實現資料來源方法
// 多少組資料- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;// 每一組有多少行資料- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;// 每一行顯示什麼內容- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

 

57.UITableView的有哪幾種樣式
  • UITableViewStylePlain
  • UITableViewStyleGrouped

 

58.UITableViewController的認識
  • tableVieController有個tableView屬性,指向一個tableView,而tableView的dataSource和delegate屬性指向就是這個控制器.並且這個控制器已經遵守了UITableViewDataSource和UITableViewDelegate協議.而每個控制器的內部都有一個view屬性,在tableVieController中,view和tableView屬性指向的是同一個對象.

 

59.效能最佳化的思路
  • iOS裝置的記憶體有限,如果用UITableView顯示成千上萬條資料,就需要成千上萬個UITableViewCell對象的話,那將會耗盡iOS裝置的記憶體。要解決該問題,需要重用UITableViewCell對象

 

60.UITableView的效能最佳化的實現步驟
/**  每當一個cell要進入視野範圍就會調用這個方法 */- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{// 1.定義一個重用標識static NSString *ID = @"tim";// 2.去緩衝池取可迴圈利用的cellUITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];// 3.緩衝池如果沒有可迴圈利用的cell,自己建立if (cell == nil) {cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];// 建議:所有cell都一樣的設定,寫在這個大括弧中;所有cell不都一樣的設定寫在外面cell.backgroundColor = [UIColor redColor];}// 4.設定資料cell.textLabel.text = [NSString stringWithFormat:@"第%zd行資料",indexPath.row];return cell;}

 

61.registerClass:的作用
  • 根據一個ID註冊這個ID標識對應的cell類型.

 

62.通過註冊的方法如何?cell的重用

 

NSString *ID = @"wine";- (void)viewDidLoad {[super viewDidLoad];// 註冊ID 這個標識對應的cell類型為UITableViewCell[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:ID];}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{// 1.先去緩衝池中尋找可迴圈利用的cellUITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];// 2.設定資料cell.textLabel.text = [NSString stringWithFormat:@"%zd行的資料", indexPath.row];return cell;}

 

63.如何監聽tableView內部cell的點擊事件
  1. 設定代理
  2. 代理對象遵守協議
  3. 實現協議裡面的方法

 

 

64.簡述registerNib:(nullable UINib *)nib forCellReuseIdentifier:(NSString *)identifier 和registerClass:(nullable Class)cellClass forCellReuseIdentifier:(NSString *)identifier 這2個方法的區別
  • registerClass這個方法是根據ID 註冊對應的cell類型,系統建立cell的方式是通過alloc/initWithStyle...
  • registerNib 這個方法是根據ID 註冊一個xib檔案,系統建立cell的方式是通過載入xib檔案.

 

65.如何計算一段文字的寬度和高度?
  • 第一種情況:如果label只有一行,通過sizeWithAttributes:這個方法,告知這段文字的字型和字型大小就可以計算這段文字的尺寸.
  • 第二種情況:如果label需要換行計算高度,通過boundingRectWithSize: options: attributes:attributes context: 這個方法,告知這段文字的字型和字型大小,並且在一個限制的尺寸內計算這段文字的尺寸.

 

66.什麼是自訂cell?
  • 繼承自系統的UITableViewCell寫一個自己的cell

 

67.通過代碼自訂cell能在ininWithFrame:方法中添加子控制項嗎?
  • 不能,自訂cell 是在initWithStyle:reuseIdentifier:方法添加子控制項

 

68.通過代碼自訂cell能在initWithStyle:reuseIdentifier:方法中計運算元控制項的位置和尺寸嗎?
  • 不行,因為在這個方法,cell的尺寸可能還沒有,而計運算元控制項的位置和尺寸需要相對於cell來計算.通過代碼自訂cell是在layoutSubviews中計算的

 

69.通過代碼自訂cell,frame和Autolayout2中的方式有什麼區別?
  • 這2種方法,只是子控制項的位置和尺寸的確定方法不一樣.frame是通過設定子控制項的frame來確定;而Autolayout是通過添加約束的方式來確定

 

70.通過storyboard的方式是如何載入cell
  • 首先根據ID去緩衝池中取,如果緩衝中沒有,也沒有註冊,會自動去storyboard中找有沒有ID這種標識的Cell,如果有,會載入這個cell,並且綁定這個標識返回

 

71.字典轉模型第三方架構的瞭解
  • Mantle:所有模型都必須繼承自MTModel
  • JSONModel:所有模型都必須繼承自JSONModel
  • MJExtension:不需要強制繼承任何其他類

 

72.設計架構需要考慮的問題
  • 侵入性:侵入性大就意味著很難離開這個架構
  • 易用性:比如少量代碼實現N多功能
  • 擴充性:很容易給這個架構增加新功能

 

[reply]PDF檔案下載[/reply]

iOS基礎問答面試題連載(一)-附答案

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.