前言:
最近公司項目不怎麼忙, 閒暇時間把iOS 在面試中可能會遇到的問題整理了一番, 一部分題目是本身面試遇到的,一部分題目則是網上收錄的, 方便本身鞏固複習, 也分享給你們! 知識點比較多,比較雜,這裏作了分類,下面是分類連接地址;ios
面試知識點整理 - 目錄:面試
iOS | 面試知識整理 - OC基礎 (一)
iOS | 面試知識整理 - OC基礎 (二)
iOS | 面試知識整理 - OC基礎 (三)
iOS | 面試知識整理 - UI 相 關 (四)
iOS | 面試知識整理 - 內存管理 (五)
iOS | 面試知識整理 - 多 線 程 (六)
iOS | 面試知識整理 - 網絡相關 (七)
iOS | 面試知識整理 - 數據持久化 (八)
iOS | 面試知識整理 - Swift 基礎 (九)api
iOS | 面試知識整理 - UI 相關 (四)
1.ViewController 生命週期
單個viewController的生命週期數組
- initWithCoder:(NSCoder *)aDecoder:(若是使用storyboard或者xib)
- loadView:加載view
- viewDidLoad:view加載完畢
- viewWillAppear:控制器的view將要顯示
- viewWillLayoutSubviews:控制器的view將要佈局子控件
- viewDidLayoutSubviews:控制器的view佈局子控件完成
- viewDidAppear:控制器的view徹底顯示
- viewWillDisappear:控制器的view即將消失的時候
- viewDidDisappear:控制器的view徹底消失的時候
- dealloc 控制器銷燬
複製代碼
兩個控制器AB進行跳轉調用順序:緩存
A控制器先展現調用安全
- [ViewControllerA loadView]
- [ViewControllerA viewWillAppear:]
- [ViewControllerA viewWillLayoutSubviews]
- [ViewControllerA viewDidLayoutSubviews]
- [ViewControllerA viewDidAppear:]
複製代碼
B控制器跳轉調用順序bash
- [ViewControllerB loadView]
- [ViewControllerB viewDidLoad]
- [ViewControllerA viewWillDisappear:]
- [ViewControllerB viewWillAppear:]
- [ViewControllerB viewWillLayoutSubviews]
- [ViewControllerB viewDidLayoutSubviews]
- [ViewControllerA viewDidDisappear:]
- [ViewControllerB viewDidAppear:]
複製代碼
B控制器返回A順序微信
- [ViewControllerB viewWillDisappear:]
- [ViewControllerA viewWillAppear:]
- [ViewControllerB viewDidDisappear:]
- [ViewControllerA viewDidAppear:]
複製代碼
2. CALayer 和 UIView
UIView 和 CALayer都是 UI 操做的對象網絡
UIView是 CALayer用於交互的對象,UIView是CALayer的delegate ,UIView是UIResponder的子類,其中提供了不少CALayer所沒有的交互接口,主要負責處理用戶觸發的各類操做;併發
CALayer主要負責繪製,在圖像和動畫上渲染性能更好;
3.UIView 的frame,bounds,center
- frame: 描述當前界面元素在其父界面元素中的位置和大小。
- bounds: 描述當前界面元素在其自身座標系統中的位置和大小。
- center: 描述當前界面元素的中心點在其父界面元素中的位置.
4.CALayer的frame,bounds,anchorPoint,position
- frame:與view中的frame概念相同,(x,y)subLayer左上角相對於supLayer座標系的位置關係;width, height表示subLayer的寬度和高度。
- bounds:與view中的bounds概念相同,(x,y)subLayer左上角相對於自身座標系的關係;width, height表示subLayer的寬度和高度。
- anchorPoint(錨點):錨點在自身座標系中的相對位置,默認值爲(0.5,0.5),左上角爲(0,0),右下角爲(1,1),其餘位置以此類推;錨點都是對於自身來說的. 肯定自身的錨點,一般用於作相對的tranform變換.固然也能夠用來肯定位置;
- position:錨點在supLayer座標系中的位置;
5.iOS 爲何必須在主線程中操做UI
- UIKit不是線程安全的(多個線程訪問修改,可能一個線程已經釋放了,另外一個線程會訪問,以及資源搶奪問題等)
- 主線程上默認是開始 runloop 的,子線程沒有 runloop 也沒法監聽一些事件,手勢刷新UI等操做
- 在子線程更新UI可能會無效,也可能會崩潰
6. 如何處理UITableVier 中Cell 動態計算高度的問題,都有哪些方案
- 你的Cell要使用AutoLayout來佈局約束這是必須的;設置tableview的estimatedRowHeight爲一個非零值,這個屬性是設置一個預估的高度值,不用太精確。 設置tableview的rowHeight屬性爲UITableViewAutomaticDimension
- 第三方 UITableView+FDTemplateLayoutCell(計算佈局高度緩存的)
- 手動計算每一個控件的 高度並相加,最後緩存高度
7. AutoLayout 中的優先級是什麼?
AutoLayout中添加的約束也有優先級,優先級的數值是1~1000
- 一種狀況是咱們常常添加的各類約束,默認的優先級是1000,也就是最高級別,條件容許的話系統會知足咱們全部的約束需求。
- 另一種狀況就是固有約束(intinsic content size)
- Content Hugging Priority 抗拉伸優先級值越小,越容易被拉伸
- Content Compression Resistance 抗壓縮優先級 優先級越小,越先被壓縮
8. 怎麼高效的實現控件的圓角效果?
//直接對圖片進行重繪 (使用Core Graphics),實際開發加異步處理,也能夠給 SDWebImage 也作擴展;
- (UIImage *)imageWithCornerRadius:(CGFloat)radius {
CGRect rect = (CGRect){0.f, 0.f, self.size};
UIGraphicsBeginImageContextWithOptions(self.size, NO, UIScreen.mainScreen.scale);
CGContextAddPath(UIGraphicsGetCurrentContext(), [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:radius].CGPath);
CGContextClip(UIGraphicsGetCurrentContext());
[self drawInRect:rect];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
複製代碼
// 利用CAShapeLayer圓角,替換本來的layer,達到圓角效果
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:UIRectCornerAllCorners cornerRadii:self.bounds.size];
CAShapeLayer *maskLayer = [[CAShapeLayer alloc]init];
maskLayer.frame = self.bounds;
maskLayer.path = maskPath.CGPath;
self.layer.mask = maskLayer;
複製代碼
9.CALayer如何添加點擊事件
- 經過 touchesBegan: withEvent 方法,監聽屏幕點擊事件,在這個方法中經過 convertPoint 找到點擊位置,進行判斷,若是點擊了 layer 視圖內座標,就觸發點擊事件
- 經過 hitTest方法找到包含座標系的 layer 視圖
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
// 方法一,經過 convertPoint 轉爲爲 layer 座標系進行判斷
CGPoint point = [[touches anyObject] locationInView:self.view];
CGPoint redPoint = [self.redLayer convertPoint:point fromLayer:self.view.layer];
if ([self.redLayer containsPoint:redPoint]) {
NSLog(@"點擊了calayer");
}
// 方法二 經過 hitTest 返回包含座標系的 layer 視圖
CGPoint point1 = [[touches anyObject] locationInView:self.view];
CALayer *layer = [self.view.layer hitTest:point1];
if (layer == self.redLayer) {
NSLog(@"點擊了calayer");
}
}
複製代碼
10.介紹下layoutSubview和drawRect
layoutSubviews調用狀況:
- init初始化UIView不會觸發調用
- addSubview會觸發調用
- 改變view的width和height的時候回觸發調用
- 一個UIScrollView滾動會觸發調用
- 旋轉screen會觸發調用
- 改變一個UIView大小的時候會觸發superView的layoutSubviews事件
- 直接調用setLayoutSubviews會觸發調用
- -(void)viewWillAppear:(BOOL)animated會觸發一次調用
- -(void)viewDidAppear:(BOOL)animated 看狀況,可能有調用
drawRect調用狀況
- 若是UIView沒有設置frame大小,直接致使drawRect不能被自動調用。
- drawRect在loadView和viewDidLoad這兩個方法以後調用
- 調用sizeToFit後自動調用drawRect
- 經過設置contentMode值爲UIViewContentModeRedraw。那麼每次設置或者更改frame自動調用drawRect。
- 直接調用setNeedsDisplay或者setNeedsDisplayInRect會觸發調用
11. layoutIfNeeded , layoutSubViews和 setNeedsLayout區別?
- layoutIfNeeded 方法一點被調用,主線程會當即強制從新佈局,它會從當前視圖開始,一直到完成全部子視圖的佈局
- layoutSubViews 用來自定義視圖尺寸,他是系統自動調用的,開發者不能手動調用,能夠重寫改方法,讓系統在調整佈局時候按照咱們但願的方式進行佈局.這個方法在旋轉屏幕,滑動或者觸摸屏幕,修改子視圖時候被觸發.
- setNeedsLayout 和 layoutIfNeeded類似,惟一不一樣的是他不會當即強制視圖從新佈局,而是在下一個佈局週期纔會觸發更新.他主要用於多個視圖佈局前後更新的場景;
12.假如Controller太臃腫,如何優化?
- 將網絡請求抽象到單獨的類中,方便在基類中處理公共邏輯;方便在基類中處理緩存邏輯,以及其它一些公共邏輯;方便作對象的持久化。
- 將界面的封裝抽象到專門的類中, 構造專門的 UIView 的子類,來負責這些控件的拼裝。這是最完全和優雅的方式,不過稍微麻煩一些的是,你須要把這些控件的事件回調先接管,再都一一暴露回 Controller。
- 構造 ViewModel, 借鑑MVVM。具體作法就是將 ViewController 給 View 傳遞數據這個過程,抽象成構造 ViewModel 的過程。
- 專門構造存儲類,專門來處理本地數據的存取。
- 整合常量
13.程序啓動過程
main 函數執行前:
- 首先當程序啓動時,系統會讀取程序的可執行文件(mach-o), 從裏面獲取動態加載器(dylb)的路徑;
- 加載dylb, dylb會初始化運行環境,配合ImageLoader將二進制文件加載到內存中去;
- 動態連接依賴庫, 初始化依賴庫,初始化 runtime;
- runtime 會對項目中的全部類進行類結構初始化,調用全部的 load 方法;
- 最後 dylb 會返回 main 函數地址,main 函數被調用,進入程序入口
main 函數執行後:
- 內部會調用 UIApplicationMain 函數,建立一個UIApplication對象和它的代理,就是咱們項目中的 Appdelegate 類
- 開啓一個事件循環(main runloop), 監聽系統事件
- 程序啓動完畢時,通知代理Appdelegate, 調用 didFinishLaunching 代理方法,在這裏會建立 UIWindow,設置它的rootViewController,
- 最後調用 self.window makeKeyAndVisable顯示窗口
14.渲染以及圖像顯示原理過程?
- 每個UIView都有一個layer,每個layer都有個content,這個content指向的是一塊緩存,叫作backing store。
- UIView的繪製和渲染是兩個過程,當UIView被繪製時,CPU執行drawRect,經過context將數據寫入backing store。
- 當backing store寫完後,經過render server交給GPU去渲染,將backing store中的bitmap數據顯示在屏幕上。
- 說到底CPU就是作繪製的操做把內容放到緩存裏,GPU負責從緩存裏讀取數據而後渲染到屏幕上。
15.離屏渲染是什麼
- 離屏渲染,指的是 GPU (圖形處理器)在當前屏幕緩衝區之外新開闢一個緩衝區進行渲染操做。爲何離屏這麼耗時?緣由主要有建立緩衝區和上下文切換。建立新的緩衝區代價都不算大,付出最大代價的是上下文切換。
- GPU屏幕渲染有兩種方式:
- On-Screen Rendering (當前屏幕渲染) 指的是GPU的渲染操做是在當前用於顯示的屏幕緩衝區進行。
- Off-Screen Rendering (離屏渲染) 指的是在GPU在當前屏幕緩衝區之外開闢一個緩衝區進行渲染操做。
16. 那些狀況會形成離屏渲染?
- 爲圖層設置遮罩(layer.mask)
- 將圖層的layer.masksToBounds / view.clipsToBounds屬性設置爲true
- 將圖層layer.allowsGroupOpacity屬性設置爲YES和layer.opacity小於1.0
- 爲圖層設置陰影(layer.shadow *)。
- 爲圖層設置layer.shouldRasterize=true
- 具備layer.cornerRadius,layer.edgeAntialiasingMask,layer.allowsEdgeAntialiasing的圖層
- 文本(任何種類,包括UILabel,CATextLayer,Core Text等)。
17.手機適配方案
- 使用宏,針對不一樣的設備抽取導航,狀態欄,以及 tabbar 高度信息
- 寬高等比適配(X 的特殊處理)
- 圖片美工須要提供@2x,@3x進行適配
- 字體根據屏幕大小適配
- 權限針對不一樣系統進行適配
- api 適配
18. 什麼是懶加載?
懶加載 也叫作 延遲加載
,他的核心思想就是把對象的實例化儘可能延遲,在須要使用的時候纔會初始化,這樣作的好處能夠減輕大量對象實例化對資源的消耗.
另外懶加載把對象的實例化代碼抽取出來獨立出來,提升代碼的可讀性,以便代碼更好的被組織
19.什麼是響應者鏈?
響應者鏈是用於肯定事件響應
的一種機制, 事件主要是指觸摸事件(touch Event),該機制與UIKIT中的UIResponder類密切相關,響應觸摸事件的必須是繼承自UIResponder的類,好比UIView 和UIViewController
一個事件響應者的完成主要分爲2個過程: hitTest方法命中視圖和響應者鏈肯定響應者; hitTest的調用順序是從UIWindow開始,對視圖的每一個子視圖依次調用,也能夠說是從顯示最上面到最下面,直到找命中者; 而後命中者視圖沿着響應者鏈往上傳遞尋找真正的響應者.
事件傳遞過程
- 當咱們觸控手機屏幕時系統便會將這一操做封裝成一個UIEvent放到事件隊列裏面,而後Application從事件隊列取出這個事件,接着須要找到命中者, 因此開始的第一步應該是找到命中者, 那麼又是如何找到的呢?那就不得不引出UIView的2個方法:
// 返回可以相應該事件的視圖
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
// 查看點擊的位置是否在這個視圖上
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
複製代碼
- 尋找事件的命中視圖是經過對視圖調用hitTest和pointInside完成的 hitTest的調用順序是從UIWindow開始,對視圖的每一個子視圖依次調用,也能夠說是從顯示最上面到最下面 遍歷直到找到命中視圖;
響應鏈傳遞
- 找到命中者,任務並未完成,由於命中者不必定是事件的響應者,所謂響應就是開發中爲事件綁定一個觸發函數,事件發生後,執行響應函數裏的代碼
- 找到命中視圖後事件會今後視圖開始沿着響應鏈nextResponder傳遞,直到找處處理事件的響應視圖,若是沒有處理的事件會被丟棄。
- 若是視圖有父視圖則nextResponder指向父視圖,若是是根視圖則指向控制器,最終指向AppDelegate, 他們都是經過重寫nextResponder來實現。
- 自下往上查找
沒法響應的事件狀況
- Alpha=0、
- 子視圖超出父視圖的狀況、
- userInteractionEnabled=NO、
- hidden=YES
20.動畫相關有哪幾種方式?
- UIView animation --- 能夠實現基於 UIView 的簡單動畫,他是CALayer Animation封裝,能夠實現移動,旋轉,變色,縮放等基本操做,他實現的動畫沒法回撤,暫停,與手勢交互,經常使用方法以下
[UIView animateWithDuration: 10 animations:^{
// 動畫操做
}];
複製代碼
- UIViewPropertyAnimator --- 是 iOS10 中引入的處理交互式動畫接口,他是基於 UIView 實現的, 用法同 UIView animation比較相似,增長了一些新的屬性以及方法;
- CALayer Animation --- 是在更底層CALayer 上的動畫接口, 他能夠實現各類複雜的動畫效果, 實現的動畫能夠回撤,暫停與手勢交互等,經常使用的類有如下幾個:
1. CABasicAnimation——基本動畫
2. CAKeyframeAnimation——關鍵幀動畫
與CABasicAnimation的區別是:CABasicAnimation:只能從一個數值(fromValue)變到另外一個數值(toValue)CAKeyframeAnimation:會使用一個NSArray保存這些數值
3. CAAnimationGroup——動畫組
動畫組,是CAAnimation的子類,能夠保存一組動畫對象,將CAAnimationGroup對象加入層後,組中全部動畫對象能夠同時併發運行
4. 轉場動畫——CATransition
CATransition是CAAnimation的子類,用於作轉場動畫,可以爲層提供移出屏幕和移入屏幕的動畫效果。iOS比Mac OS X的轉場動畫效果少一點。
複製代碼
21. UIScrollView 原理
- UIScrollView繼承自UIView,內部有一個 UIPanGestureRecongnizer手勢。 frame 是相對父視圖座標系來決定本身的位置和大小,而bounds是相對於自身座標系的位置和尺寸的。改視圖 bounds 的 origin 視圖自己沒有發生變化,可是它的子視圖的位置卻發生了變化,由於 bounds 的 origin 值是基於自身的座標系,當自身座標系的位置被改變了,裏面的子視圖確定得變化, bounds 和 panGestureRecognize 是實現 UIScrollView 滑動效果的關鍵技術點。
23. loadView 的做用?
- loadView 用來自定義 view,只要實現了這個方法,其餘經過 xib 或 storyboard 創 建的 view 都不會被加載
24. IBOutlet 連出來的視圖屬性爲何能夠被設 置成 weak?
- 由於父控件的 subViews 數組已經對它有一個強引用
25.請簡述 UITableViewCell的複用機制
- 每次建立 cell 的時候經過 dequeueReusableCellWithIdentifier:方法建立 cell,它先到 緩存池中找指定標識的 cell,若是沒有就直接返回 nil
- 若是沒有找到指定標識的 cell,那麼會經過 initWithStyle:reuseIdentifier:建立一個 cell
- 當 cell 離開界面就會被放到緩存池中,以供下次複用
26.使用 drawRect 有什麼影響?
- drawRect 方法依賴 Core Graphics 框架來進行自定義的繪製
- 缺點:它處理 touch 事件時每次按鈕被點擊後,都會用 setNeddsDisplay 進行強制
- 重繪;並且不止一次,每次單點事件觸發兩次執行。這樣的話從性能的角度來 說,對 CPU 和內存來講都是欠佳的。特別是若是在咱們的界面上有多個這樣的 UIButton 實例,那就會很糟糕了
- 這個方法的調用機制也是很是特別. 當你調用 setNeedsDisplay 方法時, UIKit 將會 把當前圖層標記爲 dirty,但仍是會顯示原來的內容,直到下一次的視圖渲染週期,纔會 將標記爲 dirty 的圖層從新創建 Core Graphics 上下文,而後將內存中的數據恢復出 來, 再使用 CGContextRef 進行繪製
27.可否在一個控制器 嵌入2個 TableViewController 控制器
28.一個 TableView 是否能夠關聯2個不一樣的dataSource?
- 能夠關聯多個數據源,重點只要處理好數據源和 tableView 的對接工做便可
29.masksToBounds 和clipsToBounds
- masksToBounds 是指子 layer 在超出父 layer時是否被裁剪,YES表示參見,NO 表示不裁剪, 默認是NO
clipsToBounds 是指子 View 在超出父 View時是否被裁剪
30.tintColor 是什麼?
- tintColor 是 ios7之後 UIView類添加的一個新屬性,用於改變應用的主色調,默認是 nil
31.imageNamed 和 imageWithContentsOfFile區別
- imageNamed 會自動緩存新加載的圖片,並切重複利用緩存圖片,通常用於App 內常用的尺寸不大的圖片
- imageWithContentsOfFile 根據路徑加載沒有 取緩存和緩存的過程,用於一些大圖,使用完畢會釋放內存
32.View 和 View 傳值方式有哪些
- 經過視圖類對外提供的屬性直接傳值
- 經過代理傳值
- 經過通知傳值
- 經過 Block 傳值
- 經過NSUserDefault, 不建議
33. 爲何iOS提供 UIView 和CAlayer 兩個個平行的層級結構
- UIView 和CAlayer2個平行的層級結構主要是用於職責分離,實現視圖的繪製,顯示,佈局解耦,避免重複代碼
- 在iOS 和 Mac OS兩個平臺上,事件和用戶交互有不少不一樣的地方,建立2個層級結構,能夠在2個平臺上共享代碼,從而使得開發快捷.
34.UIWindow是什麼,有什麼特色?
- UIWindow 繼承自 UIView, 做爲根視圖來裝置 View元素, UIWindow提供一個區域用於顯示UIView,而且將事件分發給 UIView,通常一個應用只有一個 UIWindow;
35. 什麼是隱式動畫和顯示動畫
- 隱式動畫通常都是經過 UIView 的 Block 方式,經過設置一直可見屬性:如 Frame,bounds,center,size,transfrom,backgroundColor等,便可自動生成屬性變化的過渡動畫
[UIView animateWithDuration:1 animations:^{
view.center = self.view.center;
}];
複製代碼
- 隱式動畫通常作一些簡單動畫,若是動畫須要沿着曲線運動,或者其餘複雜動畫,隱式動畫就沒法知足了.須要使用顯示動畫,顯示動畫須要提供完整的動畫流程,實現更爲負責的動畫效果
CABasicAnimation *positionAnima = [CABasicAnimation animationWithKeyPath:@"position.y"];
positionAnima.duration = 0.8;
positionAnima.fromValue = @(self.imageView.center.y);
positionAnima.toValue = @(self.imageView.center.y-30);
positionAnima.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
positionAnima.repeatCount = HUGE_VALF;
positionAnima.repeatDuration = 2;
positionAnima.removedOnCompletion = NO;
positionAnima.fillMode = kCAFillModeForwards;
[self.imageView.layer addAnimation:positionAnima forKey:@"AnimationMoveY"];
複製代碼
36. UIButton 和UITableView的層級結構
繼承結構
- UIButton -> UIControl -> UIView -> UIResponder -> NSObject
- UITableView -> UIScrollView -> UIView -> UIResponder -> NSObject
內部子控件結構
- UIButton內部子控件結構: 默認有兩個, 一個UIImageView, 一個UILable, 分別能夠設置圖片和文字, button設置屬性基本都是set方法
- UITableView內部子控件結構: UITableView中每一行數據都是UITableViewCell, UITableViewCell內部有一個UIView控件 (contentView, 做爲其它元素的父控件) , 兩個UILable 控件 (textLable, detailTextLable) , 一個UIImageView控件 (imageView) , 分別用於容器, 顯示內容, 詳情和圖片
37. Storyboard/xib 和 純代碼UI相比,有哪些優缺點
優勢:
- 簡單直接快速, 經過拖拽和點選便可配置UI,界面所見即所得
- 在 Storybord能夠清楚的區分ViewController 界面之間的跳轉關係
缺點:
- 協做衝突,多人編輯時,容易發生衝突,很難解決衝突
- 很難作到界面繼承和重用
- 不便於進行模塊化管理
- 影響性能
38.AutoLayout 和 Frame在UI佈局和渲染上有什麼區別?
- AutoLayout是針對多尺寸屏幕的設計,其本質是經過線性不等式設置UI控件的相對位置,從而適配多種屏幕設備
- Frame 是基於XY座標軸系統佈局機制,它從數學上限定了UI 控件的具體位置,是 iOS'開發中最低層,最基本的界面佈局方式
- AutoLayout性能比 Frame 差不少,AutoLayout佈局過程是首先求解線性不等式,而後在轉化爲Frame進行佈局,其中求解計算量很是大,很損耗性能;
39.SafeArea, SafeAreaLayoutGuide, SafeAreaInsets 關鍵詞的比較說明?
因爲 iphoneX 採用了劉海
設計,iOS11引入了安全區域(SafeArea)
概念
- SafeArea是指App 顯示內容的區域,不包括StatusBar,Navigationbar,tabbar,和 toolbar, 在 iPhoneX 中通常是指扣除了statusBar(44像素),和底部home indicator(高度爲34像素)的區域.這樣操做不會被劉海或者底部手勢影響了.
- SafeAreaLayoutGuide 是指 Safe Area 的區域範圍和限制, 在佈局設置中,能夠取得他的上下左右4個邊界位置進行相應的佈局
- SafeAreaInsets限定了Safe Area區域與整個屏幕之間的佈局關係,通常用上下左右4個值來獲取 SafeArea 與屏幕邊緣之間的距離;
40.UIScrollView 的 contentView, contentInset, contentSize, contentOffset 關鍵字比較?
- contentView 是指 UIScrollView上顯示內容的區域,用戶 addSubView 都是在 contentView上進行的;
- contentInset 是指 contentView與 UIScrollView的邊界;
- contentSize 是指 contentView 的大小,表示能夠滑動範圍;
- contentOffset 是當前 contentView 瀏覽位置左上角點的座標;
41. 圖片png與jpg的區別是什麼?
png:
優勢:無損格式,不論保存多少次,理論上圖片質量都不會受任何影響;支持透明
缺點:尺寸過大;打開速度與保存速度和jpg無法比
jpg:
優勢:尺寸較小,節省空間;打開速度快
缺點:有損格式,在修圖時不斷保存會致使圖片質量不斷下降;不支持透明
在開發中,尺寸比較大的圖片(例如背景圖片)通常適用jpg格式,減少對內存的佔用!
下一篇入口:
iOS | 面試知識整理 - 內存管理 (五)
其實呢做爲一個開發者,有一個學習的氛圍跟一個交流圈子特別重要,這是個人微信 你們有興趣能夠添加 邀請小夥伴們進入微信羣裏一塊兒 交流(想要進入的可加小編微信17512010526)
做者:LEON_iOS
連接:www.jianshu.com/p/c6b7302b7…
來源:簡書