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屬性?
直接使用CGRectMake函數
利用臨時結構體變量
直接運用結構體賦值
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如何自定義控件? 并且簡單的描述下每一個步驟的理由?
新建一個繼承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如何展示數據?
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.簡述[crayon-5896e1476e7ef931474791-i/] 和[crayon-5896e1476e7f3900013126-i/] 這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多功能
擴展性:很容易給這個框架增加新功能