iOS面試題

一、堆和棧什麼區別?

 答:管理方式:對於棧來說,是由編譯器自動管理,無需咱們手工控制;對於堆來講,釋放工做由程序員控制,容易產生memory leakjava

二、數組和鏈表什麼區別?ios

 答:數組是將元素在內存中連續存放,因爲每一個元素佔用內存相同,能夠經過下標迅速訪問數組中任何元素。程序員

       鏈表剛好相反,鏈表中的元素在內存中不是順序存儲的,而是經過存在元素中的指針聯繫到一塊兒。

三、delegate和notification什麼區別,什麼狀況使用?objective-c

答:Delegate:
        消息的發送者(sender)告知接收者(receiver)某個事件將要發生,delegate贊成然而後發送者響應事件,數據庫

        delegate機制使得接收者能夠改變發送者的行爲。編程

        一般發送者和接收者的關係是直接的一對多的關係。數組

      Notification:
      消息的發送者告知接收者事件已經發生或者將要發送,僅此而已,接收者並不能反過來影響發送者的行爲。安全

      一般發送者和接收者的關係是間接的多對多關係。服務器

 

四、什麼是MVC,爲何使用MVC,有什麼好處?多線程

答: 分別爲: 模型(Model),視圖(View)和控制Controller)。

          模型(Model) 「數據模型」(Model)用於封裝與應用程序的業務邏輯相關的數據以及對數據的處理方法。

                                「模型」有對數據直接訪問的權力,例如對數據庫的訪問。

          視圖(View) 視圖層可以實現數據有目的顯示。

          控制器(Controller) 控制器起到不一樣層面間的組織做用,用於控制應用程序的流程。

 

5.Objective-C的類能夠多重繼承麼?能夠實現多個接口麼?Category是什麼?重寫一個類的方式是用繼承好,仍是用分類好,爲何?

答案:

Objective-C的類不支持多繼承。能夠實現多可接口(協議)。

Category是Objective-C的類別,是一種爲現有的類添加新方法的方式。

重寫一個類的方式用繼承好。(1)使用繼承能夠定義一個具備父類全部功能的新類,它繼承了父類的這些功能,當與父類功能有所不一樣時候,能夠在子類中將其覆蓋。(2)類別中沒法向類中添加新的實例變量,類別沒有位置容納實例變量。

說明

類別有兩個方面的侷限性:第一,沒法向類中添加新的實例變量。類別沒有位置容納實例變量。第二,命名衝突,即類別中的方法與現有的方法重名。當發生命名衝突時,類別具備更高的優先級。你的類別方法將徹底取代初始方法,從而沒法再使用初始化方法。有些編程人員再本身的類別方法中增長一個前綴,以確保不發生命名衝突。

類別的做用:Cocoa中的類別主要用於3個目的:將類的實現分散到多個不一樣文件或多個不一樣框架中,建立對私有方法的前向引用,以及向對象添加非正式協議。

 

6.#import#include有什麼區別?#import <>  #import "" 又有什麼區別?

答案:

C語言使用#include語句通知編譯器應在頭文件中查詢定義。在Objective-C程序中也可使用#include來實現這個目的。#import是GCC編譯器提供的,Xcode在編譯Objective-C、和C++程序時候都會使用它。#import能夠保證頭文件只被包含一次,而不論此命令實際上在那個文件中出現多少次。通常來講,在導入Objective-C頭文件的時候使用#import,在包含C頭文件時使用#include。

#import "" 指示預處理程序在一個或者多個文件目錄(一般首先在包含源文件的目錄中查找,可是經過修改適當的「項目設置」,能夠用Xcode指定預處理程序搜索的確切位置)中尋找指定文件。

#import <> 將致使預處理程序只在特殊的「system」頭文件目錄中尋找包含文件,當前目錄不會被搜索,一樣,使用Xcode能夠經過修改菜單中選擇「項目」、「編輯項目設置」來更改這些目錄。

#import <Foundation/Foundation.h>語句告訴編譯器查看Fondation框架中的Foundation.h頭文件

 

7.類變量的@protected,@private,@public,@package聲明各有什麼含義?

答案:

@protected —Methods defined in the class and any subclasses can directly access the instance variables that follow.This is the default case.

該類和全部的子類中的方法能夠直接訪問這樣的變量,這是默認的

@private —Methods defined in the class can directly access the instance variables that follow, but subclasses cannot.

該類中的方法能夠訪問這樣的變量,子類不能夠。

@public —Methods defined in the class and any other classes or modules can di- rectly access the instance variables that follow.

除了本身和子類中的方法外,也能夠被其餘類或者其餘模塊中的方法所訪問。開放性最大。

@package —For 64-bit images, the instance variable can be accessed anywhere within the image that implements the class.

對於64位圖像,這樣的成員變量能夠在實現這個類的圖像中隨意訪問。

 

8.id聲明的對象有什麼特性?

答案:id是任意對象類型的,不能表示基本對象類型。id類型是通用指針類型,由於經過指針,也就是內存地址來引用對象,因此能夠自由地將它們在id變量之間來回賦值。所以,返回id類型值的方法是返回指向內存中某對象的指針。而後能夠將該值賦給任何對象變量。由於不管在哪裏,對象老是攜帶它的isa成員。因此即便將它存儲在id類型的通用對象變量中,也老是能夠肯定它的類。

 

九、從一個數組中找出重複的元素打印出來

   NSArray *arr = [NSArrayarrayWithObjects:@"1",@"2",@"1",@"7",@"4",@"5",@"2",@"6",@"5",nil];

    NSMutableArray *arrmu = [[NSMutableArray alloc]init];//過濾

    NSMutableArray *sameArray = [[NSMutableArrayalloc]init];//找出相同的

   for (int i = 0 ; i < [arrcount]; i++) {

        

      id str = [arr objectAtIndex:i];

       if ([arrmu count] == 0)

        {

            [arrmu addObject:str];

        }

       else{

           BOOL flag = NO;

           for (int j = 0; j < [arrmu count]; j++ ) {

               if ([strisEqual:[arrmu objectAtIndex:j]])

                {

                    [sameArrayaddObject:str];

                    flag =YES;

                   break;

                }

               else{

                    flag =NO;

                }

            }

           if (flag == NO) {

                

                [ arrmuaddObject:str];

            }

        }

    }

    

   NSLog(@"sameArray : %@",sameArray);

還有兩種直接找出的方法,上代碼:

一:

NSArray *arr = [NSArrayarrayWithObjects:@"1",@"2",@"1",nil];

    NSSet *set = [NSSet setWithArray:arr];

   NSLog(@"%@",[set allObjects]);

二:

NSArray *arr =@[@1,@2,@1];

   NSMutableDictionary *dict = [NSMutableDictionarydictionary];

   for (NSNumber *numberin arr) {

        [dict setObject:number forKey:number];

    }

   NSLog(@"%@",[dictallValues]);


十、UITableView可否綁定多個數據源?

答:不能

十一、一個UIViewController可否管理多個UITableView ?

答:能夠

十二、ios四、五、6相對於以前的版本添加了哪些新特性?
  這個就比較多了,好比:拋棄谷歌地圖 新推Maps應用 ,大幅增強中國本地化支持,Siri開口講普通話,經過iCloud體驗分享樂趣,Passbook電子票券管理,隨時隨地的FaceTime,電話功能加強,Safari支持全屏瀏覽,Mail應用新增VIP,萬能輔助:更強大等等了

 

1三、同步請求和異步請求什麼區別?

答:發送同步請求,程序將中止用戶交互,直至服務器返回數據完成,才能夠進行下一步操做,

      異步請求不會阻塞主線程,而會創建一個新的線程來操做,用戶發出異步請求後,依然能夠對UI進行操做,程序能夠繼續運行。


1四、iOS中的多線程操做、多線程方式

答:iOS提供了方便的多線程調用機制:NSOperationNSOperationQueue。它的使用方法也很簡單,

通常都是將NSOperation對象加入到NSOperationQueue隊列中,加入後隊列就開始處理,知道任務操做完成。

1五、UIViewController的生命週期

答:當一個視圖控制器被建立,並在屏幕上顯示的時候。 代碼的執行順序
      // 視圖顯示在屏幕上的順序

     一、 alloc                    建立對象,分配空間。

    二、init (initWithNibName)    初始化對象,初始化數據。

    三、loadView                   從nib載入視圖, 這一步不須要去幹涉。除非沒有使用xib文件建立視圖。

    四、viewDidLoad                加載完畢,能夠進行自定義數據以及動態建立其餘控件。

    五、viewWillAppear             視圖將出如今屏幕以前,立刻這個視圖即將顯示在屏幕上。

    六、viewDidAppear              視圖已在屏幕上渲染完成。

    // 視圖將被從屏幕上移除的順序

    一、viewWillDisappear          視圖將被從屏幕上移除以前執行。

    二、viewDidDisappear           視圖已經被從屏幕上移除。

    三、dealloc                    視圖被銷燬,此時須要在init和viewDidLoad中建立的對象進行釋放。

    四、viewDidUnload              出現內存警告在內存不足時執行,並對全部非當前顯示的controller執行。

 

     本視圖的全部子視圖將被銷燬,以釋放內存,此時開發者須要手動對viewLoad、viewDidLoad中建立的對象釋放內存。

     由於當這個視圖再次顯示在屏幕上的時候,viewLoad、viewDidLoad 再次被調用,以便再次構造視圖。



1六、Autorerelease對象何時釋放?

答:autorelease實際上只是把對release的調用延遲了,對於每個Autorelease,系統只是把該Object放入了當前的Autorelease pool中,當該pool被釋放時,該pool中的全部Object會被調用Release。


1三、iOS數據持久化方式

  答:四種:屬性列表、對象歸檔、SQLite3和Core Data

 

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

 答:readwrite 是可讀可寫特性;須要生成getter方法和setter方法時

readonly 是隻讀特性  只會生成getter方法 不會生成setter方法 ;不但願屬性在類外改變

assign 是賦值特性,setter方法將傳入參數賦值給實例變量;僅設置變量時;

retain 表示持有特性,setter方法將傳入參數先保留,再賦值,傳入參數的retaincount會+1;

copy 表示賦值特性,setter方法將傳入對象複製一份;須要徹底一份新的變量時。

nonatomic 非原子操做,決定編譯器生成的setter getter是不是原子操做,atomic表示多線程安全,通常使用nonatomic

 

15.常見的object-c的數據類型有那些, 和C的基本數據類型有什麼區別?如:NSInteger和int

 答:object-c的數據類型有 NSString,NSNumber,NSArray,NSMutableArray,NSData等等,這些都是class,建立後即是對象,而C語言的基本數據類型int,只是必定字節的內存空間,用於存放數值;而object-c的NSNumber包含有父類NSObject的方法和 NSNumber本身的方法,能夠完成複雜的操做。

 
16.Objective-C如何對內存管理的,說說你的見解和解決方法?
 答:Objective-C的內存管理主要有三種方式ARC(自動內存計數)、手動內存計數、內存池。
 解決方法的話: 誰持有,誰釋放。
 
17.如何對iOS設備進行性能測試?

 答:Profile-> Instruments ->Time Profiler

 

18.Object C中建立線程的方法是什麼?若是在主線程中執行代碼,方法是什麼?若是想延時執行代碼、方法又是什麼?

 答:線程建立有三種方法:使用NSThread建立、使用 GCD的dispatch、使用子類化的NSOperation,而後將其加入NSOperationQueue;在主線程執行代碼,方法是 performSelectorOnMainThread,若是想延時執行代碼能夠用performSelector:onThread:withObject:waitUntilDone: 

 

19.描述一下iOS SDK中如何實現MVC的開發模式

 答:MVC是:模型--視圖--控制  開發模式,對於iOS SDK,全部的View都是視圖層的,它應該獨立於模型層,由視圖控制層來控制。全部的用戶數據都是模型層,它應該獨立於視圖。全部的ViewController都是控制層,由它負責控制視圖,訪問模型數據。

 
 20.定義屬性時,什麼狀況使用copy、assign、retain?
 答:assign用於簡單數據類型,如NSInteger,double,bool, 其實還有後面的block等;
       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];
       }

 

21. Object-C有私有方法嗎?私有變量呢?

 答:objective-c – 類裏面的方法只有兩種, 靜態方法和實例方法,全部實例變量默認都是私有的,全部實例方法默認都是公有的。

 

22.淺拷貝和深拷貝區別是什麼

 答:拷貝:只複製指向對象的指針,而不復制引用對象自己。

深拷貝:複製引用對象自己。

 

23.自動釋放池是什麼,如何工做

  答: 當您向一個對象發送一個autorelease消息時,Cocoa就會將該對 象的一個引用放入到最新的自動釋放池。

        它仍然是個正當的對象,所以自動釋放池定義的做用域內的其它對象能夠向它發送消息。當程序執行到做用域結束的位置時,

        自動釋放池就會被釋放,池中的全部對象也就被釋放。

 

24.單件實例是什麼

 答: Foundation 和 Application Kit 框架中的一些類只容許建立單件對象,即這些類在當前進程中的惟一實例。

       舉例:NSFileManager 和NSWorkspace類在使用時都是基於進程進行單件對象的實例化。

       當向這些類請求實例的時候,它們會向您傳遞單一實例的一個引用,若是該實例還不存在,則首先進行實例的分配 和初始化。

 

25.類別的做用?繼承和類別在實現中有何區別?
 答:category 能夠在不獲悉,不改變原來代碼的狀況下往裏面添加新的方法,只能添加,不能刪除修改。


      而且若是類別和原來類中的方法產生名稱衝突,則類別將覆蓋原來的方法,由於類別具備更高的優先級。
類別主要有3個做用:

      
(1)將類的實現分散到多個不一樣文件或多個不一樣框架中。


      (2)建立對私有方法的前向引用。

      
(3)向對象添加非正式協議。
 

      繼承能夠增長,修改或者刪除方法,而且能夠增長屬性。

 

26.類別和類擴展的區別。
 答:category和extensions的不一樣在於 後者能夠添加屬性。另外後者添加的方法是必需要實現的。
extensions能夠認爲是一個私有的Category。

 

27.KVO and KVC?

 答:kvc:鍵 - 值編碼是一種間接訪問對象的屬性,使用字符串來標識屬性,而不是經過調用存取方法,直接或經過實例變量訪問的機制。
不少狀況下能夠簡化程序代碼。apple文檔其實給了一個很好的例子。
kvo:鍵值觀察機制,他提供了觀察某一屬性變化的方法,極大的簡化了代碼。
具體用看到用到過的一個地方是對於按鈕點擊變化狀態的的監控。
好比我自定義的一個button
[cpp] 
[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查找的邏輯理解,就說的過去了。
 
30.代理的做用?
 答:代理的目的是改變或傳遞控制鏈。容許一個類在某些特定時刻通知到其餘類,而不須要獲取到那些類的指針。能夠減小框架複雜度。
另一點,代理能夠理解爲java中的回調監聽機制的一種相似。
 
31.說說響應鏈

答: 事件響應鏈。包括點擊事件,畫面刷新事件等。在視圖棧內從上至下,或者從下之上傳播。
 
32.frame和bounds有什麼不一樣?

答:frame指的是:該view在父view座標系統中的位置和大小。(參照點是父親的座標系統)
bounds指的是:該view在自己座標系統中 的位置和大小。(參照點是自己座標系統)
 
33.方法和選擇器有何不一樣?

答:selector是一個方法的名字,method是一個組合體
 
35.ARC自動引用技術
答:1.ARC是編譯特性,不是運行時特性,只是在編譯的時候,編譯器會自動加上釋放代碼
    2.不能調用release、retain、autorelease、retainCount
    3.dealloc注意
     1> 不能在dealloc中調用[super dealloc]
     2> 不能在dealloc中釋放資源
   4.@property參數說明
    1> retain 改成 strong
    2> 基本數據類型(int\float)仍是用assign
    3> copy 仍是 copy
    4> 若是2個對象循環引用,一端用strong,一端用weak
    5> weak是用在對象上,weak其實做用跟assign至關
    5.ARC中只容許使用經過@autoreleasepool {}建立自動釋放池
 
36 GCD技術
答:Grand Central Dispatch簡稱GCD 解決多核並行運算的一種方案
看代碼就行: 

//  Grand Central Dispatch簡稱GCD技術

    

// Do any additional setup after loading the view.

    

//    dispatch_queue_t newDispath = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//    dispatch_async(newDispath, ^{

//        [self downloadImage];

//    });

    

//    #defineDISPATCH_QUEUE_PRIORITY_HIGH  2

//    #defineDISPATCH_QUEUE_PRIORITY_DEFAULT  0

//    #defineDISPATCH_QUEUE_PRIORITY_LOW (-2)

//    #defineDISPATCH_QUEUE_PRIORITY_BACKGROUNDINT16_MIN

    

    

    

    

   /*dispatch queue分爲下面三種:

    * Serial:又稱爲private dispatch queues,同時只執行一個任務。Serial queue一般用於同步訪問特定的資源或數據。當你建立多           Serial queue時,雖然它們各自是同步執行的,但Serial queueSerial queue之間是併發執行的。

    * Concurrent: 又稱爲global dispatch queue,能夠併發地執行多個任務,可是執行完成的順序是隨機的。

    * Main dispatch queue它是全局可用的serial queue,它是在應用程序主線程上執行任務的

    */

    

   //  通常GCD 能夠以下操做

    

   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{

        // 耗時的操做

       dispatch_async(dispatch_get_main_queue(), ^{

            // 更新界面

        });

    });

    

    [selfexampleDispatch];

    

    /*

     *系統給每個應用程序提供了三個concurrent dispatch queues

     *這三個併發調度隊列是全局的,它們只有優先級的不一樣。

     *由於是全局的,咱們不須要去建立。咱們只須要經過使用函數dispath_get_global_queue去獲得隊列

     */

    

   dispatch_queue_t globalQ =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0); 

    

    NSLog(@"global:%p",globalQ);

    dispatch_queue_t mainQ =dispatch_get_main_queue();

     NSLog(@"mainQ:%p",mainQ);

    /*

     *雖然dispatch queue是引用計數的對象,可是以上兩個都是全局的隊列,不用retainrelease

     */

    

    

    

    /*

     *dispatch_group_async能夠實現監聽一組任務是否完成,完成後獲得通知執行其餘的操做。

     *這個方法頗有用,好比你執行三個下載任務,當三個任務都下載完成後你才通知界面說完成的了。

     */

    timeInt = 0;

    [NSTimerscheduledTimerWithTimeInterval:1

                                    target:self

                                  selector:@selector(checkingTime)

                                  userInfo:nil

                                   repeats:YES];

    [selfexampleDispath_group];

    

    

   /*dispatch_barrier_async的使用

     *dispatch_barrier_async是在前面的任務執行結束後它才執行,並且它後面的任務等它執行完成以後纔會執行

     */

    

    [selfexampleDispatch_barrier];

    

    

   /*dispatch_apply

     *執行某個代碼片斷N次。

     */

    dispatch_apply(5, globalQ, ^(size_t index) {

        // 執行5

    });

相關文章
相關標籤/搜索