一、SDWebImage的原理,實現機制。
:先從內存圖片緩存查找是否有圖片,如果內存中已經有圖片緩存,SDImageCacheDelegate 回調 imageCache:didFindImage:forKey:userInfo: 到 SDWebImageManager。
2:如果內存緩存中沒有,生成 NSInvocationOperation 添加到隊列開始從硬盤查找圖片是否已經緩存。
3:SDWebImageManagerDelegate 回調 webImageManager:didFinishWithImage: 到 UIImageView+WebCache 等前端展示圖片。
4:如果從硬盤緩存目錄讀取不到圖片,說明所有緩存都不存在該圖片,需要下載圖片,回調 imageCache:didNotFindImageForKey:userInfo:。
5:圖片下載由 NSURLConnection 來做,實現相關 delegate 來判斷圖片下載中、下載完成和下載失敗
6:connectionDidFinishLoading: 數據下載完成后交給 SDWebImageDecoder 做圖片解碼處理
7:SDWI 也提供了 UIButton+WebCache 和 MKAnnotationView+WebCache,方便使用
8:SDWebImagePrefetcher 可以預先下載圖片,方便后續使用
二、如何解決TableView卡的問題。
tableView 滑動卡的問題主要是因為從緩存中或者是從本地讀取圖片給UIImage的時候耗費的時間。如果是動態行高,計算出高度之后在緩存。
把這兩句話放到子線程:
NSData *imgData = [NSData dataWithContentsOfURL:[NSURL URLWithString:app.icon]]; //得到圖像數據
UIImage *image = [UIImage imageWithData:imgData];
三、block和代理的,通知的區別。block的用法需要注意些什么。
1:代理: 代理就是來解決類耦合性和封裝變化點的,多人開發中,防止一個類改變導致別的地方也被動改變,代理通俗的說其實就是set賦值,用對象地址調用對象的方法,給對象賦值。代理是委托方聲明方法,并調用,代理方實現。
2:block:目的就是能夠直接存儲一個代碼塊的實現部分,而不需要再去定義一個函數,block就是去相當于實現代理,block是委托方聲明block方法,并調用,在代理方里面用委托方調用那個block方法,并且實現。block效率更高。block防止內存泄漏,解決循環引用的問題。
3:通知:首先通知可以群發,而代理和block只能單發,通知就是一方傳值,一方接收值,把所有的東西傳到一個集合里,可以控制發送給全部還是自己,接收也同樣可以控制。通知傳值在遠距離傳值時有優勢。例子:第一頁推出第二頁,第二頁推出第三頁,要想把第三頁的值傳給第一頁,用通知傳。
如果用block,block的實體在第一頁,指針在第三頁,無法結合,因為第三頁是第二頁推出來的,需要和第二頁先進行交互,代理道理和block差不多。
四、strong,weak,retain,assign,copy, nomatic 等的區別。
1、assign: 簡單賦值,不更改索引計數,防止循環引用。
2、strong:一般來說,類“內部”的屬性設置為strong,類“外部”的屬性設置為weak。說到底就是一個歸屬權的問題。小心出現循環引用導致內存無法釋
3: retain:保留計數,獲得對象的所有權。不用自動管理內存(ARC)用retain很多;retain拷貝指針。
4:copy: 建立一個索引計數為1的對象,然后釋放舊對象 用來復制對象。
5:nomatic:對屬性賦值的時候不加鎖,多線程并發訪問會提高性能。
五、NSString 的時候用copy和strong的區別。
首先要用copy因為copy修飾的NSString,在初始化時,如果來源是NSMutableString的話,會對來源進行一次深拷貝,將來源的內存地址復制一份,這樣,兩個對象就一點關系就沒有了,無論你怎么操作來源,都不會對自己的NSString有任何影響。
比如你有一個:
@property(nonatomic,copy) NSString *str;
然后有一個:
NSMutableString *sourceStr;
當你進行str = sourceStr操作之后,緊接著你又改變了sourceStr的內容sourceStr = @"change";那么str的內容并不會改變. 如果你的str不是copy修飾的,而是strong修飾的,那么str的值也會變成@"change";因為strong是淺拷貝的,并不會對來源的內存地址進行拷貝,你只需要記住一點,當你給你的的NSString對象賦值時,如果來源是NSMutableString,那么這種情況就必須要用copy;如果你確定來源是不可變類型的,比如@"http://www.baidu.com”這種固定的字符串,那么用strong比較好.
- 首先,得到視頻的URL
- 根據URL創建AVPlayerItem
- 把AVPlayerItem 提供給 AVPlayer
- AVPlayerLayer 顯示視頻。
- AVPlayer 控制視頻, 播放, 暫停, 跳轉 等等。
- 播放過程中獲取緩沖進度,獲取播放進度。
- 視頻播放完成后做些什么,是暫停還是循環播放
使用 AVPlayer 的時候,一定要注意 AVPlayer 、 AVPlayerLayer 和 AVPlayerItem 三者之間的關系。 AVPlayer 負責控制播放, layer 顯示播放, item 提供數據,當前播放時間, 已加載情況。 Item 中一些基本的屬性, status, duration, loadedTimeRanges, currentTime(當前播放時間)。
介紹項目:
在介紹項目的時候,可以從項目整體到模塊,模塊從左到右,界面從上到下的順序一一介紹。或者從項目整體到模塊,在介紹模塊時,從重要、核心模塊開始。在介紹項目時,要將項目整體定位、功能模塊、主要技術都要介紹清楚,有一定的層次性
2、MVC設計模式是什么? 你還熟悉什么設計模式
設計模式:并不是一種新技術,而是一種編碼經驗,使用比如java中的接口,iphone中的協議,繼承關系等基本手段,用比較成熟的邏輯去處理某一種類型的事情,總結為所謂設計模式。
mvc設計模式 :模型,視圖,控制器,可以將整個應用程序在思想上分成三大塊,對應是的數據的存儲或處理,前臺的顯示,業務邏輯的控制。 Iphone本身的設計思想就是遵循mvc設計模式
代理模式:代理模式給某一個對象提供一個代理對象,并由代理對象控制對源對象的引用.
單例模式:單例模式創建以后,全局使用。說白了就是一個類不通過alloc方式創建對象,而是用一個靜態方法返回這個類的對象。
3:開發者證書
證書分兩種:開發者證書、發布者證書。前者開發時使用,后者發布使用
(1) 模擬器調試無需代碼簽名;真機調試需開發者證書代碼簽名;發布時需發布證書簽名
(2) 代碼簽名需要:證書+私鑰,
(3) 真機調試時要求在設備上安裝描述文件(provision profile),該文件包含信息:調試者證書,
授權調試設備清單,應用ID。一個應用對應一個描述文件
4:如何追蹤app崩潰率,如何解決線上閃退
當App閃退時,操作系統會生成一個crash日志,保存在設備上。crash日志上有很多有用的信息,比如每個正在執行線程的完整堆棧跟蹤信息和內存映像,這樣就能夠通過解析這些信息進而定位crash發生時的代碼邏輯,從而找到App閃退的原因
違反iOS系統規則產生crash的三種類型:
(1)內存報警閃退
內存過低時,系統會發出內存過低警告。嘗試收回一些內存,如果沒有改善,將會終止當前的運行程序。
(2) 響應超時
當應用程序對一些特定的事件(比如啟動、掛起、恢復、結束)響應不及時蘋果的Watchdog機制會把應用程序干掉。
(3) 用戶強制退出
總結閃退原因:常見的崩潰原因基本都是代碼邏輯問題或資源問題,比如數組越界,訪問野指針或者資源不存在,或資源大小寫錯誤等。
5:APP發布的上架流程
1.登錄應用發布網站添加應用信息;
2.下載安裝發布證書;
3.選擇發布證書,使用Archive編譯發布包,用Xcode將代碼(發布包)上傳到服務器;
4.等待審核通過;
5.生成IPA:菜單欄->Product->Archive.
6:對沙盒的理解
1.應用程序在自己的沙盒中運作,但是不能訪問任何其他應用程序的沙盒;
2.應用之間不能共享數據,沙盒里的文件不能被復制到其他應用程序的文件夾中,也不能把其他應用文件夾復制到沙盒中;
3.蘋果禁止任何讀寫沙盒以外的文件,禁止應用程序將內容寫到沙盒以外的文件夾中;
4.沙盒目錄里有三個文件夾:Documents——存儲;應用程序的數據文件,存儲用戶數據或其他定期備份的信息;Library下有兩個文件夾,Caches存儲應用程序再次啟動所需的信息,Preferences包含應用程序的偏好設置文件,不可在這更改偏好設置;temp存放臨時文件即應用程序再次啟動不需要的文件
7、內存的使用和優化的注意事項
1:重用問題:如UITableViewCells、UICollectionViewCells、UITableViewHeaderFooterViews設置正確的reuseIdentifier,充分重用
2)盡量把views設置為不透明:當opque為NO的時候,圖層的半透明取決于圖片和其本身合成的圖層為結果,可提高性能;
3)不要使用太復雜的XIB/Storyboard:載入時就會將XIB/storyboard需要的所有資源,包括圖片全部載入內存,即使未來很久才會使用。那些相比純代碼寫的延遲加載,性能及內存就差了很多;
4)正確選擇圖片加載方式:
8:plist文件是用來做什么的。一般用它來處理一些什么方面的問題
我們常用的NSUserDefaults偏好設置實質上就是plist文件操作。plist文件是用來持久化存儲數據的;我們要存儲全國城市名稱和id,那么我們要優先選擇plist直接持久化存儲,因為更簡。
9、在提交蘋果審核時,遇到哪些問題被拒絕
1)最常見到的就是app中有虛擬物品交易,但是不是走內購導致被拒。
2)音頻類App或者使用到音頻相關的app,因為版權問題而被拒
10、熟悉CocoaPods么?能大概講一下工作原理么
它會為我們創建一個工作區間,然后將所有在cocoapods中的引入的第三方庫以libPods.a這樣的方式引入到我們的工程中,這樣就可以直接訪問第三方庫了
11、你一般是如何調試Bug的?
線上Bug:項目使用了友盟統計,因此會有崩潰日志,通過解析dYSM可以直接定位到大部分bug崩潰之處
測試Bug:根據測試所反饋的bug描述,若語義不清晰,則直接找到提bug人,操作給開發人員看,最好是可以bug復現。解決bug時,若能根據描述直接定位bug出錯之處,則好處理;若無法直觀定位
12、簡單描述一下XIB與Storyboards,說一下他們的優缺點
優點:
? XIB:在編譯前就提供了可視化界面,可以直接拖控件,也可以直接給控件添加約束,更直觀一些,而且類文件中就少了創建控件的代碼,確實簡化不少,通常每個XIB對應一個類。
? Storyboard:在編譯前提供了可視化界面,可拖控件,可加約束,在開發時比較直觀,而且一個storyboard可以有很多的界面,每個界面對應一個類文件,通過storybard,可以直觀地看出整個App的結構。
? 缺點:
? XIB:需求變動時,需要修改XIB很大,有時候甚至需要重新添加約束,導致開發周期變長。XIB載入相比純代碼自然要慢一些。對于比較復雜邏輯控制不同狀態下顯示不同內容時,使用XIB是比較困難的。當多人團隊或者多團隊開發時,如果XIB文件被發動,極易導致沖突,而且解決沖突相對要困難很多。
? Storyboard:需求變動時,需要修改storyboard上對應的界面的約束,與XIB一樣可能要重新添加約束,或者添加約束會造成大量的沖突,尤其是多團隊開發。對于復雜邏輯控制不同顯示內容時,比較困難。當多人團隊或者多團隊開發時,大家會同時修改一個storyboard,導致大量沖突,解決起來相當困難。
13、在App中混合HTML5開發App如何實現的。在App中使用HTML5的優缺點是什么?
常是通常UIWebView來實現,用代理方法去攔截。
優缺點:
? iOS加入H5響應比原生要慢很多,體驗不太好,這是缺點。
? iOS加入H5可以實現嵌入別的功能入口,可隨時更改,不用更新版本就可以上線,這是最大的優點
14、請描述一下同步和異步,說說它們之間的區別。
區別:
? 線程同步:是多個線程訪問同一資源時,只有當前正在訪問的線程訪問結束之后,其他線程才能開始訪問(被阻塞)。
? 線程異步:是多個線程在訪問競爭資源時,可以在空閑等待時去訪問其它資源(不被阻塞)。
15、線程是什么?進程是什么?二者有什么區別和聯系?
一個程序至少有一個進程,一個進程至少有一個線程:
進程:一個程序的一次運行,在執行過程中擁有獨立的內存單元,而多個線程共享一塊內存
線程:線程是指進程內的一個執行單元。
聯系:線程是進程的基本組成單位
15、iOS本地數據存儲都有哪幾種方式?
NSUserDefaults:用來保存應用程序設置和屬性、用戶保存的數據。用戶再次打開程序或開機后這些數據仍然存在。NSUserDefaults可以存儲的數據類型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。缺點:如果要存儲其他類型,需要轉換為前面的類型,才能用NSUserDefaults存儲。
Write寫入方式永久保存在磁盤中。第一步:獲得文件即將保存的路徑:第二步:生成在該路徑下的文件:第三步:往文件中寫入數據:最后:從文件中讀出數據:
SQLite3:采用SQLite數據庫來存儲數據。SQLite作為一中小型數據庫,應用ios中,跟前三種保存方式相比,相對比較復雜一些。