iOS面試題集錦

1、前言部分

文中的問題多收集整理自網絡,不保證100%準確,還望斟酌採納。 java

一、iOS9有哪些新特性?

答案:程序員

  1)改進了 Siriweb

  基於日期、位置和相簿名稱來搜索我的照片和視頻
  要求 Siri 來提醒您在 Safari、「郵件」、「備忘錄」和「信息」等應用中看到的有關內容
  提供大衆公交路線objective-c

  2)加強 Spotlight 搜索功能數據庫

  獲取體育比分、天氣情況和股票價格
  執行簡單的數學計算和單位換算
  在聯繫人的搜索結果中發送信息、撥打電話和 FaceTime 通話設計模式

  3)新增 iPad 功能數組

  4)Slide Over緩存

  不用離開正在使用的應用便可快速使用另外一款應用
  在 Slide Over 應用之間輕鬆切換
  支持 Apple 應用和已啓用的第三方應用安全

  5)Split View服務器

  可同時查看兩個應用並與之互動
  可以調整視圖,讓兩個應用大小相同,或一大一小
  支持 Apple 應用和已啓用的第三方應用
 
  6)新增畫中畫功能

  一邊使用您喜好的應用一邊繼續觀看視頻
  支持 Safari 視頻、FaceTime、視頻和播客及已啓用的第三方應用

  7)改進了 QuickType

  利用 Multi-Touch 手勢,在 iPad 上選擇文本更爲輕鬆
  在 iPad 上利用快捷工具欄來快速訪問文本編輯工具
  支持硬件鍵盤快捷鍵
  支持全部 Unicode 旗幟表情符號

  8)改進了「地圖」

  支持特選大城市中的大衆公交路線、車站進出站口信息、時刻安排和路線
  根據諸如食物、飲料、購物和娛樂之類的類別來瀏覽您附近的地點
  在加盟零售方的地點卡上顯示該處是否支持 Apple Pay
  地點卡包括維基百科上關於地標和城市的信息

  9)從新設計了「備忘錄」應用

  用內建相機或從「照片圖庫」將照片來添加到您的備忘錄中
  建立實用的核對清單,輕點一下便可勾選已完成的項目
  僅用單指速繪,便可記下閃現的想法
  利用其餘應用中的「共享」菜單直接將感興趣的項目存儲到「備忘錄」中

  10)全新的 News 新聞應用

  閱讀喜好的報紙、雜誌、博客,或從一百萬多個主題中選讀
  精美的設計排版、佈局、圖庫、視頻、動畫及更多內容
  在「爲你推薦」中瀏覽根據您的興趣愛好挑選出來的文章。在「探索」中查找推薦的頻道和主題。您閱讀的內容越多,News 新聞就越

    個性化輕鬆與朋友共享文章或將文章存儲起來稍後閱讀-您甚至能夠離線閱讀

  11)改進了「郵件」

  搜索功能可根據發件人、收件人、主題或選項組合來過濾搜索結果,幫您快速找到要尋找的內容
  支持「標記」功能,讓您無需離開「郵件」便可給圖像或 PDF 附件添加文本、形狀,甚至簽名等註釋,併發回郵件
  輕鬆存儲收到的附件,或者在編寫新郵件時添加來自 iCloud Drive 或其餘文稿提供者的文件

  12)改進了 Apple Pay 和 Wallet

  支持 Discover 卡
  支持回饋卡、商店信用卡和借記卡
  若要加速結帳,您能夠在鎖屏連點兩下主屏幕按鈕,並將手指放在 Touch ID 上來準備付款

  13)新建 iCloud Drive 應用

  按照日期、名稱或您在 Mac 上添加的標記來輕鬆搜索文件,或者瀏覽新 iCloud Drive
  在兼容的應用中打開文件,或者與您選擇的對象共享
  整理文件夾和文件
  在「設置」> iCloud > iCloud Drive 中獲取 iCloud Drive 應用,而後選擇「在主屏幕上顯示」

  14)改進了 CarPlay

  回放音頻留言,聽取留言者本身的聲音
  徹底支持車內旋鈕控制,您能夠傾斜或旋轉來滾動瀏覽列表或者平移查看「地圖」
  支持汽車製造商的 CarPlay 應用  

  15)延長了電池使用壽命

  在須要充電前增長了最多一小時的可用時間
  檢測屏幕朝下的狀態,在不用時關閉顯示器
  低電量模式下最優化設備性能,可將電池電量延長最多三小時

二、http請求方式有哪些?

答案:

      1)GET
  2)HEAD
  3)PUT
  4)DELETE
  5)POST
  6)OPTIONS

三、uiview的圓角屬性設置方法?

答案:

      1)m_mainImgView.layer.cornerRadius = 具體數值;

      2)m_mainImgView.layer.masksToBounds= YES;

四、masksToBounds屬性的做用是什麼?

答案:

       決定子layer是否被當前layer的邊界剪切,默認是NO

五、描述iOS程序的運行流程 ?

答案:

      1. 系統調用app的main函數

      2. main函數調用UIApplicationMain.

      3. UIApplicationMain建立sharedapplication instance, UIApplication默認的instance.

      4. UIApplicationMain讀取Info.plist找到主nib文件, 加載nib,把shared applicationinstance 設爲nib的owner.

      5. 經過nib文件,建立app的獨立UIWindows object.

      6. 經過nib,實例化了程序的AppDelegate object.

     7. app內部啓動結束,application:didFinishLaunchingWith-Options: 被設定成 wAppDelegate instance.

     8. AppDelegate向UIWindowinstance發makeKeyAndVisible消息, app界面展現給用戶. app準備好接收用戶的操做指令. 

六、 iOS內存管理的方式有哪些?

答案:

      手動管理(MRC)   自動內存管理(ARC) 

七、 Object-C有多繼承嗎?沒有的話用什麼代替?

答案:

       OC 自己是沒有多繼承的,可是咱們能夠經過協議來實現相似C++中的多繼承。

八、屬性readwrite,readonly,assign,retain,copy,nonatomic 各是什麼做用,在那種狀況下用?

答案:
  1. readwrite 是可讀可寫特性;須要生成getter方法和setter方法時
  2. readonly 是隻讀特性 只會生成getter方法 不會生成setter方法 ;不但願屬性在類外改變
  3. assign 是賦值特性,setter方法將傳入參數賦值給實例變量;僅設置變量時;
  4. retain 表示持有特性,setter方法將傳入參數先保留,再賦值,傳入參數的retaincount會+1;
  5. copy 表示賦值特性,setter方法將傳入對象複製一份;須要徹底一份新的變量時。
  6. nonatomic 非原子操做,決定編譯器生成的setter getter是不是原子操做,atomic表示多線程安全,

   通常使用nonatomic 

九、對於語句NSString*obj = [[NSData alloc] init]; obj在編譯時和運行時分別時什麼類型的對象?

答案:
  編譯時是NSString的類型;運行時是NSData類型的對象 

十、id 聲明的對象有什麼特性?

答案:
   id 聲明的對象具備運行時的特性,便可以指向任意類型的objcetive-c的對象; 

十一、 原子(atomic)跟非原子(non-atomic)屬性有什麼區別?

答案:
  1. atomic提供多線程安全。是防止在寫未完成的時候被另一個線程讀取,形成數據錯誤
  2. non-atomic:在本身管理內存的環境中,解析的訪問器保留並自動釋放返回的值,若是指定了 nonatomic ,

  那麼訪問器只是簡單地返回這個值。 

十二、 類別和類擴展的區別是什麼? 

答案:

       category和extensions的不一樣在於 後者能夠添加屬性。另外後者添加的方法是必需要實現的。
       extensions能夠認爲是一個私有的Category。 

1三、 在iOS應用中如何保存數據?

答案:

     有如下幾種保存機制:
  1.經過web服務,保存在服務器上
  2.經過NSCoder固化機制,將對象保存在文件中
  3.經過SQlite或CoreData保存在文件數據庫中 

1四、Object-C有私有方法嗎?私有變量呢?

答案:

objective-c– 類裏面的方法只有兩種, 靜態方法和實例方法. 這彷佛就不是完整的面向對象了,按照OO的原則就是一個對象

只暴露有用的東西. 若是沒有了私有方法的話,對於一些小範圍的代碼重用就不那麼順手了. 在類裏面聲名一個私有方法

複製代碼
1 @interface Controller : NSObject { NSString *something; }
2 + (void)thisIsAStaticMethod;
3 – (void)thisIsAnInstanceMethod;
4 @end
5 @interface Controller (private) -
6 (void)thisIsAPrivateMethod;
7 @end
複製代碼

@private能夠用來修飾私有變量在Objective‐C中,全部實例變量默認都是私有的,全部實例方法默認都是公有的

1五、關鍵字const什麼含義?

答案:

  const意味着」只讀」,下面的聲明都是什麼意思?
  const int a;
  int const a;
  const int *a;
  int * const a;
  int const * a const;

  前兩個的做用是同樣,a是一個常整型數。第三個意味着a是一個指向常整型數的指針(也就是,整型數是不可修改的,但指針能夠)

    第四個意思a是一個 指向整型數的常指針(也就是說,指  針指向的整型數是能夠修改的,但指針是不可修改的)。最後一個意味

  着a是一個指向常整型數的常指針(也就是說,指針指向 的整型數是不可修改的,同時指針也是不可修改的)。

  結論:
  關鍵字const的做用是爲給讀你代碼的人傳達很是有用的信息,實際上,聲明一個參數爲常量是爲了告訴了用戶這個參數的應用目的

  若是你曾花不少時間清理其它人留下的垃圾,你就會很快學會感謝這點多餘的信息。(固然,懂得用const的程序員不多會留下的

  垃圾讓別人來清理的。)經過給優化器一些附加的信息,使用關鍵字const也許能產生更緊湊的代碼。合理地使用關鍵字const

  可使編譯器很天然地保護那些不但願被改變的參數,防止其被無心的代碼修改。簡而言之,這樣能夠減小bug的出現。

  欲阻止一個變量被改變,可使用 const 關鍵字。在定義該const 變量時,一般須要對它進行初始化,由於之後就沒有機會再

  去改變它了; 
  2)對指針來講,能夠指定指針自己爲const,也能夠指定指針所指的數據爲 const,或兩者同時指定爲const; 
  3)在一個函數聲明中,const能夠修飾形參,代表它是一個輸入參數,在函數內部不能改變其值; 
  4)對於類的成員函數,若指定其爲const 類型,則代表其是一個常函數,不能修改類的成員變量; 
  5)對於類的成員函數,有時候必須指定其返回值爲const 類型,以使得其返回值不爲「左值」。

1六、關鍵字volatile有什麼含義?並給出三個不一樣例子?

答案:

  一個定義爲volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設這個變量的值了。精確地說就是,

  優化器在用到這個變量時必須每次都當心地從新讀取這個變量的值,而不是使用保存在寄存器裏的備份。

  下面是volatile變量的幾個例子:
  1) 並行設備的硬件寄存器(如:狀態寄存器)
  2) 一箇中斷服務子程序中會訪問到的非自動變量(Non-automatic variables)
  3)多線程應用中被幾個任務共享的變量

1七、一個參數既能夠是const還能夠是volatile嗎?解釋爲何。

答案:

  是的。一個例子是隻讀的狀態寄存器。它是volatile由於它可能被意想不到地改變。它是const由於程序不該該試圖去修改它。

1八、 一個指針能夠是volatile 嗎?解釋爲何。

答案:
  能夠是的。

  儘管這種狀況並不常見,但它仍是能夠。一個例子就是:

  當一箇中斷服務子程序企圖去修改一個指向一個buffer指針的時候。

1九、static有什麼做用?

答案:

  1)函數體內 static 變量的做用範圍爲該函數體,不一樣於 auto 變量,該變量的內存只被分配一次,所以其值在下次調用時

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

20、#import 跟#include 又什麼區別,@class呢, #import<> 跟 #import」」又什麼區別?

答案:
  #import是Objective-C導入頭文件的關鍵字,#include是C/C++導入頭文件的關鍵字, 使用#import頭文件會自動

  只導入一次,不會重複導入,至關於#include和#pragma once;@class告訴編譯器某個類的聲明,當執行時,

  纔去查看類的實現文件,能夠解決頭文件的相互包含;#import<>用來包含系 統的頭文件,#import」」用來包含用

  戶頭文件。 

2一、線程和進程的區別?

答案:

  進程和線程都是由操做系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的併發性。進程和線程的主要差異

  在於它們是不一樣的操做系統資源管理方式。進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響,

  而線程只是一 個進程中的不一樣執行路  徑。線程有本身的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就

  等於整個進程死掉,因此多進程的程序要比多線程的程 序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對於一些要求

  同時進行而且又要共享某些變量的併發操做,只能用線程,不能用進程。

2二、堆和棧的區別?

答案:

  管理方式:對於棧來說,是由編譯器自動管理,無需咱們手工控制;對於堆來講,釋放工做由程序員控制,容易產生memoryleak。
  申請大小:
  棧:在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統

  預先規定好的,在 WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就肯定的常數),若是申請的空間超過棧的

  餘空間時,將提示overflow。因 此,能從棧得到的空間較小。
  堆:堆是向高地址擴展的數據結構,是不連續的內存區域。這是因爲系統是用鏈表來存儲的空閒內存地址的,天然是不連續的,

  而鏈表的遍歷方向是由低地址向高地址。堆的大小受限於計算機系統中有效的虛擬內存。因而可知,堆得到的空間比較靈活,

  也比較大。
  碎片問題:對於堆來說,頻繁的new/delete勢必會形成內存空間的不連續,從而形成大量的碎片,使程序效率下降。對於棧來說,

  則不會存在這個問題,由於棧是先進後出的隊列,他們是如此的一一對應,以致於永遠都不可能有一個內存塊從棧中間彈出
  分配方式:堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,好比局部

  變量的分配。動態分配由alloca函數進行分配,可是棧的動態分配和堆是不一樣的,他的動態分配是由編譯器進行釋放,無需咱們

  手工實現。
  分配效率:棧是機器系統提供的數據結構,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的

  指令執行,這就決定了棧的效率比較高。堆則是C/C++函數庫提供的,它的機制是很複雜的。

2三、介紹一下Object-C的內存管理機制?

答案:

  1)當你使用new,alloc和copy方法建立一個對象時,該對象的保留計數器值爲1.當你再也不使用該對象時,你要負責向該對象發送一條

  release或autorelease消息.這樣,該對象將在使用壽命結束時被銷燬.
  2)當你經過任何其餘方法得到一個對象時,則假設該對象的保留計數器值爲1,並且已經被設置爲自動釋放,你不須要執行任何操做來

   確保該對象被清理.若是你打算在一段時間內擁有該對象,則須要保留它並確保在操做完成時釋放它.
  3)若是你保留了某個對象,你須要(最終)釋放或自動釋放該對象.必須保持retain方法和release方法的使用次數相等.爲何不少

  內置的類,如TableViewController的delegate的屬性是assign不是retain。

  循環引用
  全部的引用計數系統,都存在循環應用的問題。例以下面的引用關係:
     1)對象a建立並引用到了對象b.
     2)對象b建立並引用到了對象c.
     3)對象c建立並引用到了對象b.
  這時候b和c的引用計數分別是2和1。當a再也不使用b,調用release釋放對b的全部權,由於c還引用了b,因此b的引用計數爲1,

  b不會被釋放。b不釋放,c的引用計數就是1,c也不會被釋放。今後,b和c永遠留在內存中。這種狀況,必須打斷循環引用

  經過其餘規則來維護引用關係。好比,咱們常見的delegate每每是assign方式的屬性而不是retain方式 的屬性,

  賦值不會增長引用計數,就是爲了防止delegation兩端產生沒必要要的循環引用。若是一個UITableViewController對象a

  經過retain獲取了UITableView對象b的全部權,這個UITableView對象b的delegate又是a,若是這個delegate是retain方式的,

  那基本上就沒有機會釋放這兩個對象了。本身在設計使用delegate模式時,也要注意這點。

2四、定義屬性時,什麼狀況使用copy、assign、retain?

答案:  

  assign用於簡單數據類型,如NSInteger,double,bool,
  retain和copy用於對象,
  copy用於當a指向一個對象,b也想指向一樣的對象的時候,若是用assign,a若是釋放,再調用b會crash,若是用copy 的方式,

  a和b各自有本身的內存,就能夠解決這個問題。retain 會使計數器加一,也能夠解決assign的問題。
  另外:atomic和nonatomic用來決定編譯器生成的getter和setter是否爲原子操做。在多線程環境下,原子操做是必要的,

  不然有可能引發錯誤的結果。加了atomic,setter函數會變成下面這樣: 

 if (property != newValue) {
   [property release];
   property = [newValue retain];
 } 

2五、對象是何時被release的?

答案:

  引用計數爲0時。 autorelease實際上只是把對release的調用延遲了,對於每個Autorelease,系統只是把該Object放入

  了當前的 Autoreleasepool中,當該pool被釋放時,該pool中的全部Object會被調用Release。對於每個Runloop,

  系統會隱式建立一個Autoreleasepool,這樣全部的release pool會構成一個象CallStack同樣的一個棧式結構,

  在每個Runloop結束時,當前棧頂的Autoreleasepool會被銷燬,這樣這 個pool裏的每一個Object

  (就是autorelease的對象)會被release。那什麼是一個Runloop呢?一個UI事件,Timercall, delegate call,

   都會是一個新的Runloop

2六、iOS有沒有垃圾回收機制?

答案:

  Objective-C 2.0也是有垃圾回收機制的,可是隻能在Mac OS X Leopard10.5 以上的版本使用。

2七、介紹一下tableView的重用機制?

答案:

  查看UITableView頭文件,會找到NSMutableArray*  visiableCells,和NSMutableDictnery* reusableTableCells兩個結構。

  visiableCells內保存當前顯示的cells,reusableTableCells保存可重 用的cells。

  TableView顯示之初,reusableTableCells爲空,那麼 tableViewdequeueReusableCellWithIdentifier:CellIdentifier返回nil。

  開始的cell都是 經過[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]

  來建立,並且cellForRowAtIndexPath只是調用最大顯示cell數的 次數。好比:有100條數據,iPhone一屏最多顯示10個cell。

  程序最開始顯示TableView的狀況是:

  1. 用[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]建立10次cell,

  並給cell指定一樣的重用標識(固然,能夠爲不一樣顯示類型的 cell指定不一樣的標識)。而且10個cell所有都加入到visiableCells數組,

  reusableTableCells爲空。

  2. 向下拖動tableView,當cell1徹底移出屏幕,而且cell11(它也是alloc出來的,緣由同上)徹底顯示出來的時候。cell11加入到

   visiableCells,cell1移出visiableCells,cell1加入到reusableTableCells。

  3. 接着向下拖動tableView,由於reusableTableCells中已經有值,因此,當須要顯示新的 cell,cellForRowAtIndexPath再次

  被調用的候,tableViewdequeueReusableCellWithIdentifier:CellIdentifier,返回cell1。 cell1加入到visiableCells,

  cell1移出reusableTableCells;cell2移出 visiableCells,cell2加入到reusableTableCells。以後再須要顯示的Cell就能夠

  正常重用了。

2八、ViewController 的loadView、viewDidLoad、viewDidUnload分別是何時調用的,在自定義

  ViewCointroller時在這幾個函數中應該作什麼工做?

答案:

  由init、loadView、viewDidLoad、viewDidUnload、dealloc的關係提及
  1)init方法

  在init方法中實例化必要的對象(聽從LazyLoad思想)
  init方法中初始化ViewController自己

  2)loadView方法
  當view須要被展現而它倒是nil時,viewController會調用該方法。不要直接調用該方法。
  若是手工維護views,必須重載重寫該方法
  若是使用IB維護views,必須不能重載重寫該方法

  3)loadView和IB構建view
  你在控制器中實現了loadView方法,那麼你可能會在應用運行的某個時候被內存管理控制調用。 若是設備內存不足的時候,

   view 控制器會收到didReceiveMemoryWarning的消息。默認的實現是檢查當前控制器的view是否在使用。 若是它的view

  不在當前正在使用的view hierarchy裏面,且你的控制器實現了loadView方法,那麼這個view將被release, loadView方法

  將被再次調用來建立一個新的view。

  4)viewDidLoad方法
  viewDidLoad 此方法只有當view從nib文件初始化的時候才被調用。
  重載重寫該方法以進一步定製view
  在iPhone OS 3.0及以後的版本中,還應該重載重寫viewDidUnload來釋放對view的任何索引
  viewDidLoad後調用數據Model

  5)viewDidUnload方法
  當系統內存吃緊的時候會調用該方法(注:viewController沒有被dealloc)
  內存吃緊時,在iPhone OS 3.0以前didReceiveMemoryWarning是釋放無用內存的惟一方式,可是OS 3.0及之後

  viewDidUnload方法是更好的方式在該方法中將全部IBOutlet(不管是property仍是實例變量)置爲nil

  (系統release view時已經將其release掉了)在該方法中釋放其餘與view有關的對象、其餘在運行時建立

  (但非系統必須)的對象、在viewDidLoad中被建立的對象、緩存數據等 release對象後,將對象置爲nil(IBOutlet只須要將

  其置爲nil,系統release view時已經將其release掉了)通常認爲viewDidUnload是viewDidLoad的鏡像,由於當view被從新

  請求時,viewDidLoad還會從新被執行viewDidUnload中被release的對象必須是很容易被從新建立的對象(好比在

  viewDidLoad或其餘方法中建立的對象),不要release用戶數據或其餘很難被從新建立的對象

  6)dealloc方法
  viewDidUnload和dealloc方法沒有關聯,dealloc仍是繼續作它該作的事情 

2九、ViewController的didReceiveMemoryWarning是在何時調用的?默認的操做是什麼?

答案:

  當程序接到內存警告時View Controller將會收到這個消息:didReceiveMemoryWarning從iOS3.0開始,不須要重載這個函數,

  把釋放內存的代碼放到viewDidUnload中去。這個函數的默認實現是:檢查controller是否能夠安全地釋放它的view(這裏加粗的

  view指的是controller的view屬性),好比view自己沒有superview而且能夠被很容易地重建(從nib或者loadView函數)。

  若是view能夠被釋放,那麼這個函數釋放view並調用viewDidUnload。你能夠重載這個函數來釋放controller中使用的其餘內存。

  但要記得調用這個函數的super實現來容許父類(通常是UIVIewController)釋放view。若是你的ViewController保存着

  view的子view的引用,那麼,在早期的iOS版本中,你應該在這個函數中來釋放這些引用。而在iOS3.0或更高版本中,

  你應該在viewDidUnload中釋放這些引用。

30、列舉Cocoa中常見的集中多線程的實現,並談談多線程安全的幾種解決辦法,通常什麼地方會用到多線程?

答案:

  NSOperation NSThread
  @sychonized 通常須要作多任務的處理時會用的多線程。

3一、怎麼理解MVC,在OC中MVC是怎麼實現的?

答案:

  MVC設計模式考慮三種對象:模型對象、視圖對象、和控制器對象。模型對象表明特別的知識和專業技能,它們負責保有應用程序

  的數據和定義操做數據的 邏輯。視圖對象知道如何顯示應  用程序的模型數據,並且可能容許用戶對其進行編輯。控制器對象

  是應用程序的視圖對象和模型對象之間的協調者。

3二、delegate和notification區別,分別在什麼狀況下使用?

答案:

  delegate針對one-to-one關係,而且reciever能夠返回值給sender;

  notification 能夠針對one-to-one/many/none,reciever沒法返回值給sender;

  因此,delegate用於sender但願接受到reciever的某個功能反饋值,notification用於通知多個object某個事件。

3三、談談對KVC(Key-Value-Coding)與KVO(Key-Value-Observing)(鍵-值-編碼 與 鍵-值-監看)的理解?

答案:

  當經過KVC調用對象時,好比:[self valueForKey:@」someKey」]時,程序會自動試圖經過幾種不一樣的方式解析這個調用。

  首先查找對象是否帶有 someKey 這個方法,若是沒找到,會繼續查找對象是否帶有someKey這個實例變量(iVar),

  若是尚未找到,程序會繼續試圖調用 -(id)valueForUndefinedKey:這個方法。若是這個方法仍是沒有被實現的話,

  程序會拋出一個 NSUndefinedKeyException異常錯誤。(Key-Value Coding查找方法的時候,不只僅會查找someKey

  這個方法,還會查找getsomeKey這個方法,前面加一個get,或者_someKey以及 _getsomeKey這幾種形式。同時,

  查找實例變量的時候也會不只僅查找someKey這個變量,也會查找_someKey這個變量是否存在。)設計valueForUndefinedKey:

  方法的主要目的是當你使用-(id)valueForKey方法從對象中請求值時,對象可以在錯誤發生前,有最後的機會響應這個請求。

3四、self.跟self的區別是什麼?

答案:

  self. 表示對象的屬性 self 表示對象自己

3五、id、nil分別表明什麼?

答案:  

  1)id和void *並不是徹底同樣。在上面的代碼中,id是指向struct objc_object的一個指針,這個意思基本上是說,id是一個指向任何

  一個繼承了Object(或者NSObject)類的對象。須要注意的是id 是一個指針,因此你在使用id的時候不須要加星號。

  好比id foo=nil定義了一個nil指針,這個指針指向NSObject的一個任意子類。而id *foo=nil則定義了一個指針,這個

  指針指向另外一個指針,被指向的這個指針指向NSObject的一個子類。 

  2)nil和C語言的NULL相同,在objc/objc.h中定義。nil表示一個Objctive-C對象,這個對象的指針指向空(沒有東西就是空)。

3六、內存管理 Autorelease、retain、copy、assign的set方法和含義?

答案:

  1)你初始化(alloc/init)的對象,你須要釋放(release)它。例如:

    NSMutableArray aArray = [[NSArray alloc] init];

  後,須要

  [aArray release];

  2)你retain或copy的,你須要釋放它。例如:

  [aArray retain]

  後,須要

  [aArray release];

  3)被傳遞(assign)的對象,你須要斟酌的retain和release。例如:

  obj2 = [[obj1 someMethod] autorelease];

  對象2接收對象1的一個自動釋放的值,或傳遞一個基本數據類型(NSInteger,NSString)時: 你或但願將對象2進行retain,

  以防止它在被使用以前就被自動釋放掉。可是在retain後,必定要在適當的時候進行釋放。

3七、談談你對於索引計數的理解?

答案:

  retain值 = 索引計數(ReferenceCounting) NSArray對象會retain(retain值加一)任何數組中的對象。當NSArray被卸載

  (dealloc)的時候,全部數組中的對象會被執行一次釋放(retain值減一)。不只僅是NSArray,任何收集類 (CollectionClasses)

  都執行相似操做。例如NSDictionary,甚至UINavigationController。Alloc/init創建的對象,索引計數爲1。無需將其再次retain

  [NSArray array]和[NSDate date]等「方法」創建一個索引計數爲1的對象,可是也是一個自動釋放對象因此是本地臨時對象,

  那麼無所謂了。若是是打算在全Class中使用的變量(iVar),則必須retain它。缺省的類方法返回值都被執行了「自動釋放」方法。

  (*如上中的NSArray)在類中的卸載方法「dealloc」中,release全部未被平衡的NS對象。(*全部未被autorelease,

  而retain值爲1的)

3八、類別的做用是什麼?

答案:

  有時咱們須要在一個已經定義好的類中增長一些方法,而不想去重寫該類。好比,當工程已經很大,代碼量比較多,或者類中

  已經包住不少方法,已經有其餘代碼調用了該類建立對象並使用該類的方法時,可使用類別對該類擴充新的方法。注意:

  類別只能擴充方法,而不能擴充成員變量。

3九、什麼是委託(舉例)?

答案:

  委託代理(degegate),顧名思義,把某個對象要作的事情委託給別的對象去作。那麼別的對象就是這個對象的代理,代替它

  來打理要作的事。反映到程序中,首先要明確一個對象的委託  方是哪一個對象,委託所作的內容是什麼。委託機制是一種設計

  模式,在不少語言中都用到的,這只是個通用的思想,網上會有不少關於這方面的介紹。那麼在蘋果開發過程當中,用到委託的

  程序實現思想以下,我主要拿如何在視圖之間傳輸信息作個例子。譬如:在兩個頁面(UIIview視圖對象)實現傳值,

  用委託(delegate)能夠很好作到!
  方法:
     

複製代碼
 1 //類A
 2 @interface A:UIView
 3         id transparendValueDelegate;
 4        @property(nomatic, retain) idtransparendValueDelegate;
 5 @end
 6 
 7 @implemtion A
 8 @synthesize transparendValueDelegate
 9 -(void)Function
10 { 
11       NSString* value = @"hello";
12       //讓代理對象執行transparendValue動做
13       [transparendValueDelegate transparendValue:value];
14 }
15 @end
16 
17 //類B
18 @interface B:UIView
19       NSString* value;
20 @end
21 
22 @implemtion B
23 -(void)transparendValue:(NSString*)fromValue
24 {
25       value = fromValue;
26       NSLog(@"the value is %@",value); 
27 }
28 @end
29 
30 //下面的設置A代理委託對象爲B
31 //在定義A和B類對象處:
32 
33 A* a = [[A alloc] init];
34 B* b = [[B alloc] init];
35 a. transparendValueDelegate = b;//設置對象a代理爲對象b
複製代碼

 這樣在視圖A和B之間能夠經過委託來傳值!

下面這個例子委託有兩類:
一、一個視圖類對象的代理對象爲父視圖,子視圖用代理實現讓父視圖顯示別的子視圖
二、同一父視圖下的一個子視圖爲另外一個子視圖的代理對象,讓另外一個子視圖改變自身背景色爲給定的顏色
===============================================
規範格式以下:

複製代碼
 1 @protocol TransparendValueDelegate;
 2 
 3 @interface A:UIView
 4 id< TransparendValueDelegate > m_dTransparendValueDelegate;
 5 @property(nomatic, retain) id m_dTransparendValueDelegate;
 6 @end
 7 //代理協議的聲明
 8 @protocol TransparendValueDelegat<NSObject>
 9 {
10       -(void)transparendValue:(NSString*)fromValue;
11 
12 } 
複製代碼

40、frame 和 bounds 的區別 ,bound的大小改變frame 改變嗎?

答案:

  frame:該view在父view座標系統中的位置和大小。(參照點是,父親的座標系統)

  bounds:該view在本地座標系統中的位置和大小。(參照點是,本地座標系統)

4一、異步請求最大數目是多大,爲何只能這麼多?

答案:

       這個數量是跟cpu有關的,併發性取決於cpu核數,每一個核只能 同時處理一個任務.4核cpu理論上能夠併發處理4個任務,

  若是按http來算就是4個請求,可是cpu是搶佔式資源,因此通常來講併發量是要根據任務的 耗時和cpu的繁忙度來計算4個左右

  只是個經驗值你開10個短耗時的任務和幾個長耗時任務的效率是不一樣的- -..通常來講估算這個量的最大效率估算公示是cpu

  核數*2-1,這個公式是當時對集羣進行壓測獲得的結論.cpu搶佔時間跟任務時長…開啓這個數量的 線程能夠最大化的榨乾cpu

  一個道理。cpu不可能都被搶去作connection.iOS是cpu密集型的消耗?。這個大概知道就好了,也不會有人特 別在乎吧…

  cpu核數*2-1那個是作淘寶的java團隊壓測獲得的線程最優數?,放在iOS上也多少適用…通常來講不超過這個量就好,

  線程不是起的越多越好,線程數就是…cpu來決定的

4二、 什麼是coredata ?

答案:

  coredata是蘋果提供一套數據保存框架,其基於SQlite 

4三、 什麼是NSManagedObject模型?

答案:

  NSManagedObject是NSObject的子類 ,也是coredata的重要組成部分,它是一個通用的類,實現了

  core data 模型層所需的基本功能,用戶可經過子類化NSManagedObject,創建本身的數據模型。 

4四、 什麼是NSManagedobjectContext ?

答案:

  NSManagedobjectContext對象負責應用和數據庫之間的交互。 

4五、何時使用NSMutableArray,何時使用NSArray?

答案:

  當數組在程序運行時,須要不斷變化的,使用NSMutableArray,當數組在初始化後,便再也不改變的,使用NSArray。

  須要指出的是,使用NSArray只代表的是該數組在運行  時不發生改變,即不能往NSAarry的數組裏新增和刪除元素,

  但不代表其數 組內的元素的內容不能發生改變。NSArray是線程安全的,NSMutableArray不是線程安全的,

  多線程使用到NSMutableArray需 要注意。 

4六、 @property 後面能夠有哪些修飾符?

答案:

讀 、寫性修飾符:readwrite | readonly

setter相關修飾符:assign | retain | copy

原子性修飾符:atomic | nonatomic

getter和setter修飾符 

4七、怎麼用 copy 關鍵字?

答案:

對於字符串和block的屬性通常使用copy  
字符串使用copy是爲了外部把字符串內容改了,不影響該屬性 

4八、 如何重寫帶 copy 關鍵字的 setter?

答案:

以上面的爲例 @property (copy) NSstring *str;

-(void)setStr:(nsstring *)str{  _str = [str copy]; } 

4九、 如何讓本身的類用 copy 修飾符?

答案:

在使用字符串或block的時候用copy修飾,在網上有人以爲有另一種理解問題的

方式就是理解成如何要本身的類也支持copy功能,這樣的話要答聽從NSCopying協議,而後實現 

50、什麼狀況使用 weak 關鍵字,相比 assign 有什麼不一樣? 

答案:assign 修飾 基本數據類型weak 修飾 弱指針對象

相關文章
相關標籤/搜索