iOS面試題-每日十道-第六天

個人理解 有誤的地方 歡迎小伙伴能給指出

一. 有網絡鏈接的應用中,在取得數據后將json字符串通過框架轉為NSDictionary或NSArray,很多人直接使用這些數據來更新UI,說說這樣做的缺點,并給出解決辦法?

  • 在書寫的時候有可能寫錯Key值或者數組角標
  • 擴展性不好,且不符合MVC思想
  • 會造成數據的重復下載,消耗用戶的流量,降低用戶體驗.
  • 如果沒有網絡或者網絡堵塞,那么UI界面接受不到任何數據,顯示不了任何內容,用戶體驗糟糕;
    解決的辦法就是通過框架轉換為字典或者數組后,在轉化模型,并進行二級緩存,需要顯示的時候從沙盒中取;
    利用框架字典轉模型重寫命名

二. id聲明的對象有什么特征?

  • id聲明的對象具有運行時的特性,即可用指向任意類型的Objcetive-c的對象,與C中void*的萬能指針相似.
  • 在編譯階段不知道它的真實類型,運行時才能知道它的真實類型,所以id類型也不能使用點語法是編譯時特性,而且id是運行時特性

三. 你碰到那些導致程序閃退的原因?如何定位閃退的位置?

  • 函數無線遞歸
  • 運行時,找不到方法(沒實現)
  • 訪問了某個已經被釋放的對象
  • 程序占用內存或CPU過高
  • 子線程阻塞主UI線程過久
  • 從Bundle加載了不存在或者不支持的對象
  • 等等....

1 在設置斷點的地方,選Add Exception Breakpoint.之后crash就會停在出錯的位置.
2 如果是在測試階段報錯的話,可以在(設置 - 通用 -關于本機 -診斷與用量)里面看到崩潰的堆棧信息.
3如果用RAC的話,訪問到已經釋放了的內存,和內存警告這2種粗出錯的幾率高一些

四. 如何實現圓角矩形?有哪些方法可以實現扇形View?

直接修改view的樣式,系統提供好的了
view.layer.cornerRadius = 6;
view.layer.masksToBounds = YES;
用layer做就可以了,十分簡單.需要庫QuartzCore.framework;

畫矩形直接利用UIBezierPath給我們封裝好的路徑方法
(x,y)點決定了矩形左上角的點在哪個位置
(width,height)是矩形的寬度高度
bezierPathWithOvalInRect:CGRectMake(x, y, width, height)
[UIBezierPath bezierPathWithOvalInRect:CGRectMake(50, 50, 100, 100)];

圓角矩形的畫法多了一個參數,cornerRadius
cornerRadius它是矩形的圓角半徑.
通過圓角矩形可以畫一個圓.當矩形是正方形的時候,把圓角半徑設為寬度的一半,就是一個圓.
UIBezierPath*path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(50,50,100,100) cornerRadius:50];
扇形:
畫扇形的方法為:先畫一個圓孤再添加一個一根線到圓心,然后關閉路徑.
關閉路徑就會自動從路徑的終點到路徑的起點封閉起下
用填充的話,它會默認做一個封閉路徑,從路徑的終點到起點.
[path fill];

五. Cocoa Touch提供了哪幾種CoreAnimation過渡類型?

Cocoa Touch提供了4中 Core Animation 分別是交叉淡化 推擠 顯示和覆蓋.

六. 能否向編譯后得到的類中增加實例變量?能否向運行時創建的類中添加實例變量,為什么?

不能向編譯后得到的類中增加實例變量
因為編譯后的類以及注冊在runtime中,類結構同中objc_ivar_list實例變量的鏈表和instance_size實例變量的內存大小已經確定
同時runtime會調用class_setlvarLayout或class_setWeakIvarLayout來處理 strong weak 引用。所以不能向存在的類中添加實例變量

能向運行時創建的的類添加實例變量運行時創建的類是可以添加實例變量,調用 class_addIvar 函數。但是得在調用 objc_allocateClassPair 之后,objc_registerClassPair 之前,原因同上。

七. 請寫出你調試解決crash問題的思路及步驟?1)把問題拆分成多個小問題,一步步檢驗,直到找到問題的根源點

2)程序運行后,查看log信息,找到錯誤的地方
3)在錯誤的地方設置斷點進行調試,可以加條件斷點
4)查看斷點運行的信息,進行修改
5).如果是在測試階段報錯的話,可以在(設置-通用-關于本機-診斷與用量)里面看到崩潰的堆棧信息。
6).如果用rac的話,訪問到已經釋放了的內存,和內存警告這2種出錯幾率要高些。

八. NSDictionary類使用了哪些數據結構和算法?

NSDictionary 使用Hash表實現Key/Object存儲;
Hash表是一種訪問速度很快的數據結構,前提是Hash函數設計合理,能夠使數據在各個子節點均勻分布,這一點使用NSString對象可以保證,這是文檔中的說明:
Classes such as NSString that are part of Foundation have a good hash function.

九. iOS和iPhone做了哪些設計來降低功耗,延長續航時間?作為應用的開發者,又如何避免費電?

  • iOS的省電機制主要有以下幾種:

  • 強化的后臺機制

  • 墓碑式:偽多任務,應用推至后臺后,雖然沒有被關閉,但是所有活動都被凍結,只能通過蘋果服務器轉發的推送來與用戶交互

  • 智能調度后臺:在一些指定類別的APP,比如社交、新聞類的應 用中,iOS系統會根據應用啟動頻率、時間和當前網絡和電量的狀況來智能分配每個應用的后臺數據獲取頻率和啟動時長,開發者自己不能設置數據具體什么時候更新

  • 真后臺:蘋果也提供一些有諸多限制的接口來保證真后臺,只供特定應用行為調用,比如后臺音頻,定位,上傳下載等。

  • 作為開發者如何省電
    ? 首先當然優化代碼,積極合理地使用runloop,多線程等技術。
    ? 其次是盡量少地調用一些費電的接口,比如頻繁的定位,頻繁的后臺更新數據,如無必要,盡量不用。

十. ARC內存管理原則是什么

永遠不寫retain,release和autorelease三個關鍵字就好~這是ARC的基本原則。


純手動 有地方是個人理解 有誤的地方希望大家能給指出 謝謝

如果對您有幫助 希望能給個關注和喜歡~~~
大家面試中遇到的問題 也可以留言分享

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 一. CALayer和UIView的區別聯系 1 UIView是UIKIt的只能在iOS使用, CALayer是Q...
    yhj0129閱讀 1,666評論 0 1
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,200評論 30 471
  • 1. 有網絡連接的應用中,在取得數據后將json字符串通過框架轉換為NSDictionary或NSArray,很多...
    離離離離閱讀 420評論 0 2
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,841評論 25 708
  • 520,沒有愛 文/土家霜妹 520,始終是會來的 愛,不一樣 它時而出逃, 去一個找不到的地方 沒有愛的520 ...
    土家霜妹閱讀 252評論 0 1