「Tim的博客」iOS基礎問答面試題連載(一)-附答案html
「Tim的博客」iOS基礎問答面試題連載(二)-附答案ios
「Tim的博客」iOS基礎問答面試題連載(三)-附答案git
「Tim的博客」iOS基礎問答面試題連載(四)github
如下是一些本身收集的比較基礎的問題(大神能夠忽略),附上答案,方便你們閱讀。俗話說得好,基礎不牢,地動山搖。文章末尾會提供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如何設置自動換行
13.Character Wrap和Word Wrap的區別
- Character Wrap 字符包裹;
- Word Wrap 單詞包裹<保證單詞的完整性>.
14.contentMode的做用
15.initWithImage:的做用?
- 根據傳入的圖片對象建立UIImageView對象;而且UIImageView的尺寸默認等於圖片的尺寸
16.如何修改一個控件的frame屬性?
- 直接使用CGRectMake函數
- 利用臨時結構體變量
- 直接運用結構體賦值
17.如何抽方法?
- 先把相同的代碼抽到方法中
- 把要變化的東西換成變量,而後編譯,把報錯的設置爲方法的參數
18.經過imageNamed:這個方法加載圖片有什麼特色?
UIImage *image =[UIImage imageNamed:@"圖片名"]xcode
- 使用場合:圖片比較小、使用頻率比較高
- 建議:把須要緩存的圖片放到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如何自定義控件? 而且簡單的描述下每個步驟的理由?
- 新建一個繼承UIView的類,(所謂自定義控件就是繼承系統自帶的控件寫一個本身的控件)
- 新建一個xib文件(xib的文件名最好和類名同樣)
- 修改最外面那個控件的class爲控件類名(只有修改類名,當時候從xib中出來的纔是我這種類型的控件)
- 提供一個模型屬性,重寫模型屬性的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中止滾動?
- 設置scrollView的代理
- 代理對象遵照<UIScrollViewDelegate>協議
- 實現協議裏面
- (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沒法滾動的緣由
- 沒有設置contentSize,或者設置的contenSize小於等於scrollView的尺寸
- scrollEnable = NO;
- userInteractionEnable = NO; // 是否容許與用戶交互
40.scrollEnable和userInteractionEnable的區別
- scrollEnable僅僅是不能滾動,其餘事件依舊可以響應
- userInteractionEnable禁止任何交互事件
41.alwaysBounceVertical alwaysBounceHorizontal的做用
- 無論有沒有contentSize,老是有彈簧效果;做用:用來作下拉刷新和上拉刷新的
42.如何監聽UIScrollView各類行爲
- 設置scrollView的delegate(代理)爲控制器對象
- 控制器要遵照協議UIScrollViewDelegate協議
- 控制器要實現UIScrollViewDelegate協議裏面的方法
43.代理的注意點
- scrollView的代理能夠是任何類型的OC 對象
- 代理必定是weak
44.利用UIScrollView如何實現內容縮放
- 設置代理
- 實現代理方法
-(UIView *)viewForZoomingInScrollview:(UIScrollView *)scrollView;
- 設置縮放比例
self.scrollView.maximumZoomScale = 2.0;
self.scrollView.minimumZoomScale = 0.2;
45.如何監聽控件的行爲?
- 經過addTarget:
只有繼承來自UICotrol的對象,纔有這個功能
- 經過delegate:
只有擁有delegate屬性的控件,纔有這個功能
46.經過autolayout如何實現UILabel包裹內容?
- 設置位置約束
- 設置寬度約束<=固定值
- 不須要設置高度約束
47.什麼是適配?
- 適應、兼容各類不一樣的狀況
- 系統適配:針對不一樣版本的操做系統進行適配
- 屏幕適配:針對不一樣大小的屏幕尺寸進行適配
48.點和像素的區別
- 在用戶眼中,屏幕是由無數個像素組成的,像素越多,屏幕越清晰
- 在開發者眼中,屏幕是由無數個點組成的,點又是由像素組成的,一個點鐘包含的像素越多,屏幕越清晰.
49.什麼是Autolayout?
- Autolayout是一種「自動佈局」技術,專門用來佈局UI界面的
50.簡單描述下Autolayout的2個核心概念約束和參照
- 約束:經過給控件添加約束,來決定控件的位置和尺寸
- 參照:在添加約束時,是依照誰來添加(能夠是父控件或者兄弟控件)
51.Autolayout的警告和錯誤
- 警告:控件的frame不匹配所添加的約束
- 錯誤:1>缺少必要的約束;2>兩個約束衝突
52.經過代碼添加約束的原則
- 對於兩個同層級view之間的約束關係,添加到它們的父view上
- 對於兩個不一樣層級view之間的約束關係,添加到他們最近的共同父view上
- 對於有層次關係的兩個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如何展現數據?
- 設置數據源對象self.tableView.dataSource = self;
- 數據源對象要遵照協議
- 實現數據源方法
// 多少組數據
- (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:的做用
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的點擊事件
- 設置代理
- 代理對象遵照協議
- 實現協議裏面的方法
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]框架