iOS(OC)常見面試題

1.iOS怎麼管理內存?

在ObjC中對象時存儲在堆中的,系統並不會自動釋放堆中的內存(注意基本類型
是由系統本身管理的,放在棧上)。若是一個對象建立並使用後沒有獲得及時釋
放那麼就會佔用大量內存。OjbC中的內存管理就須要由開發人員手動維護。
1)引用計數器:在ObjC中每一個對象內部都有一個與之對應的整數(retainCount),叫「引用計數器」,當一個對象在建立以後它的引用計數器爲1,
當調用這個對象的alloc、retain、new、copy方法以後引用計數器自動在原
來的基礎上加1(ObjC中調用一個對象的方法就是給這個對象發送一個消息),
當調用這個對象的release方法以後它的引用計數器減1,若是一個對象的引用
計數器爲0,則系統會自動調用這個對象的dealloc方法來銷燬這個對象。

2)屬性參數:能夠經過@property定義屬性,此刻沒必要手動實現
getter,setter方法程序仍然沒有內存泄露,由於屬性定義的時候咱們一樣加
上了參數

clipboard.png

3)自動釋放池:一種內存自動釋放的機制叫作「自動引用計數」(或「自動釋放
池」),使用@autoreleasepool關鍵字聲明一個代碼塊,若是一個對象在初始
化時調用了autorelase方法,那麼當代碼塊執行完以後,在塊中調用過
autorelease方法的對象都會自動調用一次release方法。這樣對象就起到了
延遲自動釋放的效果.
注意:
######1.autorelease方法不會改變對象的引用計數器,只是將這個對象放
到自動釋放池中;
######2.自動釋放池實質是當自動釋放池銷燬後調用對象的release方法,不
必定就能銷燬對象(例如若是一個對象的引用計數器>1則此時就沒法銷燬);
######3.因爲自動釋放池最後統一銷燬對象,所以若是一個操做比較佔用內存
(對象比較多或者對象佔用資源比較多),最好不要放到自動釋放池或者考慮放
到多個自動釋放池;
######4.ObjC中類庫中的靜態方法通常都不須要手動釋放,內部已經調用了
autorelease方法;

2.淺複製和深複製的區別

淺複製:本質是將一個對象1的地址,交給了另外一個對象2,若是對象被釋放,則對
象2所指的地址是不安全的.
深複製:要使用copy方法,則對象必須遵照NSCopying協議
實質:將原對象的內容複製到一塊新的內存空間,拷貝的是整個對象.

3.類別和類擴展的區別?

1)類擴展僅可以在原始類中聲明(.h或.m中都可,在.m中聲明的類擴展其定義的
屬性和方法均是私有的)
2)類擴展的實現僅可以在原始類的.m中編寫
3)在類擴展中能夠擴展類的屬性.而在分類中僅可以擴展實例方法和類方法

4.使用block和使用delegate完成委託模式有什麼優勢?

1)使用block實現委託模式優勢ios

回調的block代碼塊定義在委託對象函數內部,使代碼更爲緊湊;適配對象再也不
須要實現具體某個protocol,代碼更爲簡潔。代碼可讀性更強,更有連貫性,
block常常能夠用於completion handler、error handler等。網絡請求回調。

2)delegate的優點:程序員

1.很是嚴格的語法。全部將聽到的事件必須是在delegate協議中有清晰的定義。
  2.若是delegate中的一個方法沒有實現那麼就會出現編譯警告/錯誤
  3.協議必須在controller的做用域範圍內定義
  4.在一個應用中的控制流程是可跟蹤的而且是可識別的;
  5.在一個控制器中能夠定義多個不一樣的協議,每一個協議有不一樣的delegate
  6.沒有第三方對象要求保持/監視通訊過程。
  7.可以接收調用的協議方法的返回值。這意味着delegate可以提供反饋信息給controller

5.#import和#include的區別 @class?

@class通常用於頭文件中須要聲明該類的某個實例變量的時候用到,在m文 件中仍是須要使用#import
而#import比起#include的好處就是不會引發交叉編譯

6.在一個對象的方法裏面:self.name = "object";和name = "object"有什麼不一樣嗎?

self.name ="object":會調用對象的setName()方法;
name = "object":會直接把object賦值給當前對象的name屬性。

7.請簡要說明viewDidLoad和viewDidUnload什麼時候調用

viewDidLoad在view從nib文件初始化時調用,
loadView在controller的view爲nil時調用。
此方法在編程實現view時調用,view控制器默認會註冊memory warning 
notification,
當view controller的任何view沒有用的時候,
viewDidUnload會被調用,在這裏實現將retain的view release,若是是
retain的IBOutlet view 屬性則不要在這裏release,IBOutlet會負責
release 。

8.數組和指針的區別

(1)數組能夠申請在棧區和數據區;指針能夠指向任意類型的內存塊
(2)sizeof做用於數組時,獲得的是數組所佔的內存大小;做用於指針時,得
到的都是4個字節的大小
(3)數組名錶示數組首地址,值不能夠改變,如不能夠將++做用於數組名上;
普通指針的值能夠改變,如可將++做用於指針上
(4)用字符串初始化字符數組是將字符串的內容拷貝到字符數組中;用字符串初
始化字符指針是將字符串的首地址賦給指針,也就是指針指向了該數組

9.static的做用

(1)函數體內static 變量的做用範圍爲該函數體,不一樣於 auto 變量,該變
量的內存只被分配一次, 
 所以其值在下次調用時仍維持上次的值; 
(2)在模塊內的static 全局變量能夠被模塊內所用函數訪問,但不能被模塊外
其它函數訪問; 
(3)在模塊內的static 函數只可被這一模塊內的其它函數調用,這個函數的使
用範圍被限制在聲明 
 它的模塊內; 
(4)在類中的static 成員變量屬於整個類所擁有,對類的全部對象只有一份拷
貝; 
(5)在類中的static 成員函數屬於整個類所擁有,這個函數不接收 this 指
針,於是只能訪問類的static 成員變量。

10.簡述內存分區狀況

(1)代碼區:存放函數二進制代碼
(2)數據區:系統運行時申請內存並初始化,系統退出時由系統釋放。存放全局變
量、靜態變量、常量
(3)堆區:經過malloc等函數或new等操做符動態申請獲得,需程序員手動申請和釋
放
(4)棧區:函數模塊內申請,函數結束時由系統自動釋放。存放局部變量、函數參數

11.const char p; charconstp; charconst p; const char const p;四個修飾指針有什麼區別

(1)定義了一個指向不可變的字符串的字符指針
(2)和(1)同樣
(3)定義了一個指向字符串的指針,該指針值不可改變,即不可改變指向
 (4)定義了一個指向不可變的字符串的字符指針,且該指針也不可改變指向

12.MVC的理解?

MVC模式考慮三種對象:模型對象、視圖對象和控制器對象。
    
 模型對象負責應用程序的數據和定義操做數據的邏輯;
    
 視圖對象知道如何顯示應用程序的模型數據;
    
 控制器對象是M與V之間的協調者。

13.obj-c的優缺點

objc優勢: 

      1) Cateogies 
      2) Posing 
      3) 動態識別 
      4) 指標計算 
      5)彈性訊息傳遞 
      6) 不是一個過分複雜的 C 衍生語言 
      7) Objective-C 與 C++ 可混合編程 
    缺點: 
    
      1) 不支援命名空間 
      2)  不支持運算符重載 
      3) 不支持多重繼承 
      4) 使用動態運行時類型,全部的方法都是函數調用,因此不少編譯時優
      化方法都用不到。(如內聯函數等),性能低劣。

14.隊列和棧有什麼區別:

隊列和棧是兩種不一樣的數據容器。從"數據結構"的角度看,它們都是線性結構,
即數據元素之間的關係相同。
隊列是一種先進先出的數據結構,它在兩端進行操做,一端進行入隊列操做,一
端進行出列隊操做。
棧是一種先進後出的數據結構,它只能在棧頂進行操做,入棧和出棧都在棧頂操
做。

15.簡述視圖控件器的生命週期。

loadView儘管不直接調用該方法,如多手動建立本身的視圖,那麼應該覆蓋這個
方法並將它們賦值給試圖控制器的view屬性。
viewDidLoad只有在視圖控制器將其視圖載入到內存以後才調用該方法,這是執
行任何其餘初始化操做的入口。
viewDidUnload當試圖控制器從內存釋放本身的方法的時候調用,用於清楚那些
可能已經在試圖控制器中建立的對象。
viewVillAppear當試圖將要添加到窗口中而且還不可見的時候或者上層視圖移
出圖層後本視圖變成頂級視圖時調用該方法,用於執行諸如改變視圖方向等的操
做。實現該方法時確保調用[super viewWillAppear:].
viewDidAppear當視圖添加到窗口中之後或者上層視圖移出圖層後本視圖變成頂
級視圖時調用,用於放置那些須要在視圖顯示後執行的代碼。確保調用[super 
viewDidAppear:]。

16.UIView與CLayer有什麼區別?

1) UIView是iOS系統中界面元素的基礎,全部的界面元素都是繼承自它。它本
身徹底是由CoreAnimation來實現的。它真正的繪圖部分,是由一個CALayer
類來管理。UIView自己更像是一個CALayer的管理器,訪問它的跟繪圖和跟座標
有關的屬性。

2) UIView有個重要屬性layer,能夠返回它的主CALayer實例。

3) UIView的CALayer相似UIView的子View樹形結構,也能夠向它的layer上
添加子layer,來完成某些特殊的表示。即CALayer層是能夠嵌套的。

4) UIView的layer樹形在系統內部,被維護着三份copy。分別是邏輯樹,這裏
是代碼能夠操縱的;動畫樹,是一箇中間層,系統就在這一層上更改屬性,進行
各類渲染操做;顯示樹,其內容就是當前正被顯示在屏幕上得內容。

5) 動畫的運做:對UIView的subLayer(非主Layer)屬性進行更改,系統將
自動進行動畫生成,動畫持續時間的缺省值彷佛是0.5秒。

6) 座標系統:CALayer的座標系統比UIView多了一個anchorPoint屬性,使
用CGPoint結構表示,值域是0~1,是個比例值。這個點是各類圖形變換的座標
原點,同時會更改layer的position的位置,它的缺省值是{0.5,0.5},即在
layer的中央。

7)渲染:當更新層,改變不能當即顯示在屏幕上。當全部的層都準備好時,能夠
調用setNeedsDisplay方法來重繪顯示。

8)變換:要在一個層中添加一個3D或仿射變換,能夠分別設置層的transform或
affineTransform屬性。

9)變形:Quartz Core的渲染能力,使二維圖像能夠被自由操縱,就好像是三維
的。圖像能夠在一個三維座標系中以任意角度被旋轉,縮放和傾斜。
CATransform3D的一套方法提供了一些魔術般的變換效果。

17.線程與進程的區別和聯繫?

進程和線程都是由操做系統所體會的程序運行的基本單元,系統利用該基本單元
實現系統對應用的併發性。
程和線程的主要差異在於它們是不一樣的操做系統資源管理方式。進程有獨立的地
址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響,而線程只是
一個進程中的不一樣執行路徑。線程有本身的堆棧和局部變量,但線程之間沒有單
獨的地址空間,一個線程死掉就等於整個進程死掉,因此多進程的程序要比多線
程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對於一些要
求同時進行而且又要共享某些變量的併發操做,只能用線程,不能用進程。

18.ios平臺怎麼作數據的持久化?coredata和sqlite有無必然聯繫?coredata是一個關係型數據庫嗎?

iOS中能夠有四種持久化數據的方式:屬性列表、對象歸檔、SQLite3和Core 
Data;core
data可使你以圖形界面的方式快速的定義app的數據模型,同時在你的代碼中
容易獲取到它。coredata提供了基礎結構去處理經常使用的功能,例如保存,恢復,
撤銷和重作,容許你在app中繼續建立新的任務。在使用core
data的時候,你不用安裝額外的數據庫系統,由於core data使用內置的
sqlite數據庫。core data將你app的模型層放入到一組定義在內存中的數據對
象。coredata會追蹤這些對象的改變,同時能夠根據須要作相反的改變,例如用
戶執行撤銷命令。當core
data在對你app數據的改變進行保存的時候,core data會把這些數據歸檔,並
永久性保存。
mac os x中sqlite庫,它是一個輕量級功能強大的關係數據引擎,也很容易嵌
入到應用程序。能夠在多個平臺使用,sqlite是一個輕量級的嵌入式sql數據庫
編程。與core
data框架不一樣的是,sqlite是使用程序式的,sql的主要的API來直接操做數據
表。
Core Data不是一個關係型數據庫,也不是關係型數據庫管理系統(RDBMS)。雖
然Core Dta支持SQLite做爲一種存儲類型,但它不能使用任意的SQLite數據
庫。Core
Data在使用的過程種本身建立這個數據庫。Core Data支持對1、對多的關係。

19.tableView的重用機制?

UITableView經過重用單元格來達到節省內存的目的:經過爲每一個單元格指定一
個重用標識符(reuseIdentifier),即指定了單元格的種類,以及當單元格滾出
屏幕時,容許恢復單元格以便重用.對於不一樣種類的單元格使用不一樣的ID,對於簡
單的表格,一個標識符就夠了.

20.用變量a給出下面的定義

a) 一個整型sql

b) 一個指向整型數的指針數據庫

c) 一個指向指針的的指針,它指向的指針是指向一個整型數編程

d) 一個有10個整型數的數組數組

e) 一個有10個指針的數組,該指針是指向一個整型數的安全

f) 一個指向有10個整型數數組的指針網絡

g) 一個指向函數的指針,該函數有一個整型參數並返回一個整型數數據結構

h) 一個有10個指針的數組,該指針指向一個函數,該函數有一個整型參數並返回一個整型數併發

a)   int a; 

b)   int *a; 

c)   int **a;

d)   int a[10]

e)   int *a[10];

f)   int (*a)[10];

g)   int (*a)(int);

i)   int (*a[10])(int);
相關文章
相關標籤/搜索