該文章屬于<簡書 — Timhbw>原創,轉載請注明: <簡書社區 — Timhbw>http://www.lxweimin.com/p/1ebf7333808d
iOSinterview.jpg
<簡書社區 — Timhbw>iOS基礎問答面試題連載(一)-附答案
<簡書社區 — Timhbw>iOS基礎問答面試題連載(二)-附答案
<簡書社區 — Timhbw>iOS基礎問答面試題連載(三)-附答案
<簡書社區 — Timhbw>iOS基礎問答面試題連載(四)
以下是一些自己收集的比較基礎的問題(大神可以忽略),附上答案,方便大家閱讀。俗話說得好,基礎不牢,地動山搖。文章末尾會提供PDF版的文檔,方便大家木有網的時候也可以用移動設備觀看。
1.簡單的描述下類擴展(extension)和分類(category)的區別?
- 類擴展(也稱匿名分類)沒有名字,分類有名字;
- 類擴展中新添加的方法必須要實現,分類可以不實現;
- 類擴展是分類的一個特例,可以為一個類添加一些私有的成員變量和方法;分類可以在不修改原來類的基礎上,為一個類擴展方法,一般用于給系統自帶的類擴展方法,不能添加成員變量,如果一定要添加,可以通過 runtime 動態添加。
2.簡要的說明 UIView 的 frame 和 bounds 的區別
- frame 表示的是控件矩形框在父控件中的位置和尺寸,它以父控件的左上角為坐標原點(在 iOS 坐標系中以左上角為坐標原點,往右為 X 軸正方向,往下是 Y 軸正方向)。
- bounds 表示的是控件矩形框的位置和尺寸,是以自己的左上角為坐標原點。
3.什么是控制器
- 凡是繼承自UIViewController的對象都是控制器。
4.簡單的描述控制器的作用
- 負責處理軟件界面的各種事件,并負責軟件界面的創建和銷毀.
5.簡單的描述下 Storyboard 的作用
- 用來描述描述軟件界面的。
6.簡述程序的啟動原理
- 1.執行 Main
- 2.執行 UIApplicationMain 函數.
- 3.創建 UIApplication 對象,并設置 UIApplicationMain 對象的代理.UIApplication 的第三個參數就是 UIApplication 的名稱,如果指定為nil,它會默認為 UIApplication.UIApplication 的第四個參數為 UIApplication 的代理.
- 4.開啟一個主運行循環.保證應用程序不退出.
- 5.加載 info.plist。加載配置文件.判斷一下 info.plist 文件當中有沒有 Main storyboard file base name,里面有沒有指定 Storyboard 文件,如果有就去加載 info.plist 文件,如果沒有,那么應用程序加載完畢.
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:'基本數據類型'、’枚舉‘、’結構體‘等非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.去緩存池取可循環利用的cell
UITableViewCell *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.先去緩存池中查找可循環利用的cell
UITableViewCell *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多功能
- 擴展性:很容易給這個框架增加新功能