【面試】iOS 開發面試題(一)

    1. #import 跟#include 又什麼差異,@class呢, #import<> 跟 #import」」又什麼差異?java


  答:#import是Objective-C導入頭文件的keyword。#include是C/C++導入頭文件的keyword,使用#import頭文件會本身主動僅僅導入一次,不會反覆導入,至關於#include和#pragma once;@class告訴編譯器某個類的聲明,當運行時,纔去查看類的實現文件,可以解決頭文件的相互包括;#import<>用來包括系統的頭文件,#import」」用來包括用戶頭文件。


  2. 屬性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 數組



       3. Object-c的類可以多重繼承麼?可以實現多個接口麼?Category是什麼?重寫一個類的方式用繼承好仍是分類好?爲何?安全

  答: Object-c的類不可以多重繼承;可以實現多個接口,經過實現多個接口可以完畢C++的多重繼承;Category是類別,普通狀況用分類好,用Category去重寫類的方法,僅對本Category有效。不會影響到其它類與原有類的關係。




  4.寫一個setter方法用於完畢@property (nonatomic,retain)NSString *name,寫一個setter方法用於完畢@property(nonatomic。copy)NSString *name
  - (void) setName:(NSString*) str
  {
  [str retain];
  [name release];
  name = str;
  }
  - (void)setName:(NSString *)str
  {
  id t = [str copy];
  [name release];
  name = t;
  }


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


  6.常見的object-c的數據類型有那些。 和C的基本數據類型有什麼差異?

如:NSInteger和int
  object-c的數據類型有NSString,NSNumber,NSArray,NSMutableArray,NSData等等。這些都是class,建立後即是對象,而C語言的基本數據類型int,僅僅是必定字節的內存空間。用於存放數值;NSInteger是基本數據類型,並不是NSNumber的子類。固然也不是NSObject的子類。NSInteger是基本數據類型Int或者Long的別名(NSInteger的定義typedef long NSInteger),它的差異在於。NSInteger會依據系統是32位仍是64位來決定是自己是int仍是Long。


  7.id 聲明的對象有什麼特性?多線程


  Id 聲明的對象具備執行時的特性。即可以指向隨意類型的objcetive-c的對象;


  8.Objective-C怎樣對內存管理的,說說你的見解和解決方法?app


  Objective-C的內存管理主要有三種方式ARC(本身主動內存計數)、手動內存計數、內存池。框架


  1. (Garbage Collection)本身主動內存計數:這樣的方式和java相似,在你的程序的運行過程當中。始終有一個高人在背後準確地幫你收拾垃圾。你不用考慮它何時開始工做。如何工做。你僅僅需要明確。我申請了一段內存空間。當我再也不使用從而這段內存成爲垃圾的時候,我就完全的把它忘記掉。反正那個高人會幫我收拾垃圾。遺憾的是。那個高人需要消耗必定的資源,在攜帶設備裏面。資源是緊俏商品因此iPhone不支持這個功能。函數

因此「Garbage Collection」不是本入門指南的範圍,對「Garbage Collection」內部機制感興趣的同窗可以參考一些其它的資料。只是說老實話「Garbage Collection」不大適合適剛開始學習的人研究。
  解決: 經過alloc – initial方式建立的, 建立後引用計數+1, 此後每retain一次引用計數+1, 那麼在程序中作對應次數的release就行了.
  2. (Reference Counted)手動內存計數:就是說。從一段內存被申請以後。就存在一個變量用於保存這段內存被使用的次數,咱們臨時把它稱爲計數器。當計數器變爲0的時候,那麼就是釋放這段內存的時候。post

比方說,當在程序A裏面一段內存被成功申請完畢以後。那麼這個計數器就從0變成1(咱們把這個過程叫作alloc),而後程序B也需要使用這個內存。那麼計數器就從1變成了2(咱們把這個過程叫作retain)。緊接着程序A再也不需要這段內存了,那麼程序A就把這個計數器減1(咱們把這個過程叫作release);程序B也再也不需要這段內存的時候,那麼也把計數器減1(這個過程仍是release)。當系統(也就是Foundation)發現這個計數器變成了0。那麼就會調用內存回收程序把這段內存回收(咱們把這個過程叫作dealloc)。順便提一句。假設沒有Foundation,那麼維護計數器,釋放內存等等工做需要你手工來完畢。
  解決:一般是由類的靜態方法建立的, 函數名中不會出現alloc或init字樣, 如[NSString string]和[NSArray arrayWithObject:], 建立後引用計數+0, 在函數出棧後釋放, 即至關於一個棧上的局部變量. 固然也可以經過retain延長對象的生存期.
  3. (NSAutoRealeasePool)內存池:可以經過建立和釋放內存池控制內存申請和回收的時機.
  解決:是由autorelease增長系統內存池, 內存池是可以嵌套的, 每個內存池都需要有一個建立釋放對, 就像main函數中寫的同樣. 使用也很是easy, 比方[[[NSString alloc]initialWithFormat:@」Hey you!」] autorelease], 即將一個NSString對象增長到最內層的系統內存池, 當咱們釋放這個內存池時, 當中的對象都會被釋放.


  9. 原子(atomic)跟非原子(non-atomic)屬性有什麼差異?
  1. atomic提供多線程安全。性能

是防止在寫未完畢的時候被另一個線程讀取。形成數據錯誤
  2. non-atomic:在本身管理內存的環境中。解析的訪問器保留並本身主動釋放返回的值,假設指定了 nonatomic ,那麼訪問器僅僅是簡單地返回這個值。


  10. 看如下的程序,第一個NSLog會輸出什麼?學習

這時str的retainCount是多少?

第二個和第三個呢? 爲何?
  =======================================================
  NSMutableArray* ary = [[NSMutableArray array] retain];
  NSString *str = [NSString stringWithFormat:@"test"];
  [str retain];
  [aryaddObject:str];
  NSLog(@」%@%d」,str,[str retainCount]);
  [strretain];
  [strrelease];
  [strrelease];
  NSLog(@」%@%d」,str,[str retainCount]);
  [aryremoveAllObjects];
  NSLog(@」%@%d」,str,[str retainCount]);
  =======================================================
  str的retainCount建立+1,retain+1,增長數組本身主動+1 3
  retain+1。release-1,release-1 2
  數組刪除所有對象,所有數組內的對象本身主動-1 1


  11. 內存管理的幾條原則時什麼?依照默認法則.那些keyword生成的對象
  需要手動釋放?在和property結合的時候如何有效的避免內存泄露?


  誰申請,誰釋放
  遵循Cocoa Touch的使用原則;
  內存管理主要要避免「過早釋放」和「內存泄漏」,對於「過早釋放」需要注意@property設置特性時,必定要用對特性keyword。對於「內存泄漏」,必定要申請了要負責釋放,要細心。


  keywordalloc 或new 生成的對象需要手動釋放;
  設置正確的property屬性,對於retain需要在合適的地方釋放。


  12.怎樣對iOS設備進行性能測試?


  Profile-> Instruments ->Time Profiler


  13. Object C中建立線程的方法是什麼?

假設在主線程中運行代碼。方法是什麼?假設想延時運行代碼、方法又是什麼?


  線程建立有三種方法:使用NSThread建立、使用GCD的dispatch、使用子類化的NSOperation,而後將其增長NSOperationQueue;在主線程運行代碼,方法是performSelectorOnMainThread,假設想延時運行代碼可以用performSelector:onThread:withObject:waitUntilDone:


  14.描寫敘述一下iOS SDK中怎樣實現MVC的開發模式

        MVC是Model-VIew-Controller,就是模型-視圖-控制器, MVC把軟件系統分爲三個部分:Model,View,Controller。

在cocoa中,你的程序中的每一個object(對象)都將明顯地僅屬於這三部分中的一個。而全然不屬於另外兩個。model數據模型。view是對這些數據的顯示,viewcontroller就是把model拿到view中顯示。起到model和view之間橋樑的做用。MVC可以幫助確保幫助實現程序最大程度的可重用性。

各MVC元素彼此獨立運做,經過分開這些元素,可以構建可維護。可獨立更新的程序組建, 提升代碼的重用性.



  15 淺複製和深複製的差異?


  答案:淺層複製:僅僅複製指向對象的指針。而不復制引用對象自己。
  深層複製:複製引用對象自己。


  意思就是說我有個A對象。複製一份後獲得A_copy對象後,對於淺複製來講。A和A_copy指向的是同一個內存資源,複製的僅僅只是是是一個指針,對象自己資源
  仍是僅僅有一份。那假設咱們對A_copy運行了改動操做,那麼發現A引用的對象相同被改動,這事實上違背了咱們複製拷貝的一個思想。深複製就好理解了,內存中存在了
  兩份獨立對象自己。




  16. 類別的做用?繼承和類別在實現中有何差異?
  答案:category 可以在不獲悉,不改變原來代碼的狀況下往裏面加入新的方法,僅僅能加入,不能刪除改動。


  並且假設類別和原來類中的方法產生名稱衝突,則類別將覆蓋原來的方法。因爲類別具備更高的優先級。


  類別主要有3個做用:
  (1)將類的實現分散到多個不一樣文件或多個不一樣框架中。


  (2)建立對私有方法的前向引用。
  (3)向對象加入非正式協議。
  繼承可以添加,改動或者刪除方法,並且可以添加屬性。


  17. 類別和類擴展的差異。


  答案:category和extensions的不一樣在於 後者可以加入屬性。

另外後者加入的方法是必須要實現的。
  extensions可以以爲是一個私有的Category。


  18. 什麼是KVO和KVC?


  答案:kvc:鍵 – 值編碼是一種間接訪問對象的屬性使用字符串來標識屬性。而不是經過調用存取方法。直接或經過實例變量訪問的機制。


  很是多狀況下可以簡化程序代碼。apple文檔事實上給了一個很是好的樣例。


  kvo:鍵值觀察機制。他提供了觀察某一屬性變化的方法,極大的簡化了代碼。
  詳細用看到嗯哼用到過的一個地方是對於button點擊變化狀態的的監控。
  比方我本身定義的一個button
  [self addObserver:self forKeyPath:@"highlighted" options:0 context:nil];
  #pragma mark KVO
  - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
  {
  if ([keyPath isEqualToString:@"highlighted"] ) {
  [self setNeedsDisplay];
  }
  }
  對於系統是依據keypath去取的到對應的值發生改變。理論上來講是和kvc機制的道理是同樣的。
  對於kvc機制怎樣經過key尋找到value:
  「當經過KVC調用對象時。比方:[self valueForKey:@」someKey」]時,程序會本身主動試圖經過幾種不一樣的方式解析這個調用。首先查找對象是否帶有 someKey 這種方法,假設沒找到。會繼續查找對象是否帶有someKey這個實例變量(iVar),假設尚未找到,程序會繼續試圖調用 -(id) valueForUndefinedKey:這種方法。假設這種方法仍是沒有被實現的話,程序會拋出一個NSUndefinedKeyException異常錯誤。
  (cocoachina.com注:Key-Value Coding查找方法的時候。不僅會查找someKey這種方法。還會查找getsomeKey這種方法,前面加一個get。或者_someKey以及_getsomeKey這幾種形式。

同一時候。查找實例變量的時候也會不僅查找someKey這個變量,也會查找_someKey這個變量是否存在。)
  設計valueForUndefinedKey:方法的主要目的是當你使用-(id)valueForKey方法從對象中請求值時。對象能夠在發生錯誤前。有最後的機會響應這個請求。這樣作有很是多優勢。如下的兩個樣例說明了這樣作的優勢。


  來至cocoa,這個說法應該挺有道理。
  因爲咱們知道button倒是存在一個highlighted實例變量.所以爲什麼上面咱們僅僅是add一個相關的keypath便可了。
  可以依照kvc查找的邏輯理解,就說的過去了。


  19. 代理的做用?


  答案:代理的目的是改變或傳遞控制鏈。

贊成一個類在某些特定時刻通知到其它類,而不需要獲取到那些類的指針。

可以下降框架複雜度。


  另一點。代理可以理解爲java中的回調監聽機制的一種相似。




  20. oc中可改動和不可以改動類型。
  答案:可改動不可改動的集合類。

這個我我的簡單理解就是可動態加入改動和不可動態加入改動同樣。


  比方NSArray和NSMutableArray。前者在初始化後的內存控件就是固定不可變的。後者可以加入等,可以動態申請新的內存空間。

相關文章
相關標籤/搜索