iOS 基礎筆試題

參考:https://www.jianshu.com/p/1d3496bc5bda編程

 


 

一、#import 跟#include、@class有什麼區別?#import<> 跟 #import""又什麼區別?xcode

  1.#import和#include都能完整地包含某個文件的內容,#import能防止同一個文件被包含屢次服務器

  2.@class僅僅是聲明一個類名,並不會包含類的完整聲明;@class還能解決循環包含的問題多線程

  3.#import <> 用來包含系統自帶的文件,#import 「」用來包含自定義的文件app


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

  readwrite:同時生成get方法和set方法的聲明和實現async

  readonly:只生成get方法的聲明和實現函數

  assign:set方法的實現是直接賦值,用於基本數據類型oop

  retain:set方法的實現是release舊值,retain新值,用於OC對象類型性能

  copy:set方法的實現是release舊值,copy新值,用於NSString、block等類型

  nonatomic:非原子性,set方法的實現不加鎖(比atomic性能高)


三、寫一個setter方法用於完成@property (nonatomic,retain)NSString *name,寫一個setter方法用於完成@property(nonatomic,copy)NSString *name.

@property (nonatomic, retain) NSString *name;

- (void)setName:(NSString *)name {
    if (_name != name) {
        [_name release];
        _name = [name retain];
    }
}

@property (nonatomic, copy) NSString *name;

- (void)setName:(NSString *)name {
    if (_name != name) {
        [_name release];
        _name = [name copy];
    }
}

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

  1.編譯時是NSString類型

  2.運行時是NSData類型


五、常見的object-c的數據類型有那些, 和C的基本數據類型有什麼區別?

  經常使用OC類型:NSString、NSArray、NSDictionary、NSData、NSNumber等

  OC對象須要手動管理內存,C的基本數據類型不須要管理內存


六、id 聲明的變量有什麼特性?

  id聲明的變量能指向任何OC對象


七、Objective-C如何對內存管理的,說說你的見解和解決方法?

  每一個對象都有一個引用計數器,每一個新對象的計數器是1,當對象的計數器減爲0時,就會被銷燬

  經過retain可讓對象的計數器+一、release可讓對象的計數器-1

  還能夠經過autorelease pool管理內存

  若是用ARC,編譯器會自動生成管理內存的代碼


八、內存管理的幾條原則時什麼?按照默認法則.哪些方法生成的對象須要手動釋放?在和property結合的時候怎樣有效的避免內存泄露?

  只要調用了alloc、copy、new方法產生了一個新對象,都必須在最後調用一次release或者autorelease

  只要調用了retain,都必須在最後調用一次release或者autorelease

  @property若是用了copy或者retian,就須要對再也不使用的屬性作一次release操做

  若是用了ARC,另外討論


九、看下面的程序,三次NSLog會輸出什麼?爲何?

NSMutableArray* ary = [[NSMutableArrayarray]retain];
NSString*str = [NSStringstringWithFormat:@"test"];// 1
[strretain];// 2
[aryaddObject:str];// 3
NSLog(@"%d", [strretainCount]);
[strretain];// 4[strrelease];// 3
[strrelease];// 2
NSLog(@"%d", [strretainCount]);
[aryremoveAllObjects];// 1
NSLog(@"%d", [str retainCount]);

  結果:三、二、1


十、OC中建立線程的方法是什麼?若是指定在主線程中執行代碼?如何延時執行代碼?

建立線程的方法

  NSThread

  NSOperationQueue和NSOperation

  GCD

主線程中執行代碼

[self performSelectorOnMainThread: withObject: waitUntilDone:];

[self performSelector: onThread:[NSThread mainThread] withObject: waitUntilDone:];

dispatch_async(dispatch_get_main_queue(), ^{

});

延時執行

double delayInSeconds = 2.0;

dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW,

(int64_t)(delayInSeconds * NSEC_PER_SEC));

dispatch_after(popTime, dispatch_get_main_queue(), ^(void){

});

[self performSelector: withObject: afterDelay:];

[NSTimer scheduledTimerWithTimeInterval: target: selector: userInfo: repeats:];

十一、深拷貝和淺拷貝有什麼區別?

    淺拷貝:指針(地址)拷貝,不會產生新對象

    深拷貝:內容拷貝,會產生新對象


十二、分類有什麼好處? 分類和繼承有什麼區別?

    分類能夠在不修改原來類模型的基礎上拓充方法

    分類只能擴充方法、不能擴充成員變量;繼承能夠擴充方法和成員變量

    繼承會產生新的類


1三、分類和擴展有什麼區別?

    分類是有名稱的,類擴展沒有名稱

    分類只能擴充方法、不能擴充成員變量;類擴展能夠擴充方法和成員變量

    類擴展通常就寫在.m文件中,用來擴充私有的方法和成員變量(屬性)


1四、OC中的協議和Java中的接口有什麼不一樣?

    Java的接口中聲明的方法必須都實現

    Oc的protocol中聲明的方法並不必定要實現


1五、什麼是 KVO 和 KVC?

    KVC是鍵值編碼,能夠經過一個字符串的key(屬性名)修改對象的屬性值

    KVO是鍵值監聽,能夠監聽一個對象屬性值的改變


1六、What is purpose of delegates?

    兩個對象之間傳遞數據和消息

    解耦,拆分業務邏輯


1七、OC中的mutable 和immutable分別指什麼?

    mutable是可變類型,好比NSMutableArray,能夠動態往裏面添加元素

    immutable是不可變類型,好比NSArray,固定的存儲空間,不能添加元素


1八、爲何咱們把OC稱爲運行時語言?

    動態綁定:對象類型在運行時才真正肯定

    多態性


1九、 NSNotification 和 protocol有什麼不一樣?

    經過NSNotification能夠給多個對象傳遞數據和消息

    經過protocol(代理模式)只能給一個對象傳遞數據和消息


20、什麼是 push notification?

    本地推送:程序內部彈出通知到用戶設備

    遠程推送:由推送服務器推送通知到用戶設備


2一、NSRunLoop的實現機制,及在多線程中如何使用?

  NSRunLoop是IOS消息機制的處理模式

  1.NSRunLoop的主要做用:控制NSRunLoop裏面線程的執行和休眠,在有事情作的時候使當前NSRunLoop控制的線程工做,沒有事情作讓當前NSRunLoop的控制的線程休眠。

  2.NSRunLoop 就是一直在循環檢測,從線程start到線程end,檢測inputsource(如點擊,雙擊等操做)同步事件,檢測timesource同步事件,檢測到輸入源會執行處理函數,首先會產生通知,corefunction向線程添加runloop observers來監聽事件,意在監聽事件發生時來作處理。

  3.runloopmode是一個集合,包括監聽:事件源,定時器,以及需通知的runloop observers

  使用

  1. 只有在爲你的程序建立次線程的時候,才須要運行run loop。對於程序的主線程而言,run loop是關鍵部分。Cocoa提供了運行主線程run loop的代碼同時也會自動運行run loop。IOS程序UIApplication中的run方法在程序正常啓動的時候就會啓動run loop。若是你使用xcode提供的模板建立的程序,那你永遠不須要本身去啓動run loop

  2. 在多線程中,你須要判斷是否須要run loop。若是須要run loop,那麼你要負責配置run loop並啓動。你不須要在任何狀況下都去啓動run loop。好比,你使用線程去處理一個預先定義好的耗時極長的任務時,你就能夠毋需啓動run loop。Run loop只在你要和線程有交互時才須要


2二、IOS7以前,後臺執行內容有幾種形式,都是什麼?

  通常的應用在進入後臺的時候能夠獲取必定時間來運行相關任務,也就是說能夠在後臺運行一小段時間(10S左右)。

  1. 後臺播放音樂

  2. 後臺GPS跟蹤

  3. 後臺voip支持


2三、簡單說一下APP的啓動過程,從main文件開始提及。

  程序啓動分爲兩類:1.有storyboard 2.沒有storyboard

  有storyboard狀況下:

    1.main函數

    2.UIApplicationMain

      * 建立UIApplication對象

      * 建立UIApplication的delegate對象

    3.根據Info.plist得到最主要storyboard的文件名,加載最主要的storyboard(有storyboard)

      * 建立UIWindow

      * 建立和設置UIWindow的rootViewController

      * 顯示窗口

  沒有storyboard狀況下:

    1.main函數

    2.UIApplicationMain

      * 建立UIApplication對象

      * 建立UIApplication的delegate對象

    3.delegate對象開始處理(監聽)系統事件(沒有storyboard)

      * 程序啓動完畢的時候, 就會調用代理的application:didFinishLaunchingWithOptions:方法

      * 在application:didFinishLaunchingWithOptions:中建立UIWindow

      * 建立和設置UIWindow的rootViewController

      * 顯示窗口


2四、把程序本身關掉和程序進入後臺,遠程推送的區別?

  1. 關掉後不執行任何代碼,不能處理事件

  2. 應用程序進入後臺狀態不久後轉入掛起狀態。在這種狀態下,應用程序不執行任何代碼,並有可能在任意時候從內存中刪除。只有當用戶再次運行此應用,應用纔會從掛起狀態喚醒,代碼得以繼續執行.或者進入後臺時開啓多任務狀態,保留在內存中,這樣就能夠執行系統容許的動做

  3. 遠程推送是由遠程服務器上的程序發送到APNS,再由APNS把消息推送至設備上的程序,當應用程序收到推送的消息會自動調用特定的方法執行事先寫好的代碼


2五、本地通知和遠程推送通知對基本概念和用法?

  本地通知和遠程推送通知均可以向不在前臺運行的應用發送消息,這種消息既多是即將發生的事件,也多是服務器的新數據.不論是本地通知仍是遠程通知,他們在程序界面的顯示效果相同,均可能顯示爲一段警告信息或應用程序圖標上的微章.

  本地通知和遠程推送通知的基本目的都是讓應用程序可以通知用戶某些事情, 並且不須要應用程序在前臺運行.兩者的區別在於本地通知由本應用負責調用,只能從當前設備上的iOS發出, 而遠程通知由遠程服務器上的程序發送到APNS,再由APNS把消息推送至設備上的程序


2六、 UITableViewController中,建立UITableViewCell時,initWithSytle:resuseIdentifier中,reuseIdentifier有什麼用?簡述UITableViewCell的複用原理.

  複用隊列的元素增長:只有在cell被滑動出界面的時候,此cell纔會被加入到複用隊列中。每次在建立cell的時候,程序會首先經過調用dequeueReusableCellWithIdentifier:cellType方法,到複用隊列中去尋找標示符爲「cellType」的cell,若是找不到,返回nil,而後程序去經過調用[[[UITableViewCell alloc] initWithStyle:style reuseIdentifier:cellType] autorelease]來建立標示符爲「cellType」的cell。


2七、 ViewController的loadView, viewDidLoad, viewDidUnload分別是在何時調用的?在自定義ViewController的時候這幾個函數裏面應該作什麼工做?

  答: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 。


2八、Objective C中的selector是什麼?

  你能夠理解 @selector()就是取類方法的編號,他的行爲基本能夠等同C語言的中函數指針,只不過C語言中,能夠把函數名直接賦給一個函數指針,而Objective-C的類不能直接應用函數指針,這樣只能作一個@selector語法來取.它的結果是一個SEL類型。這個類型本質是類方法的編號(函數地址)。


 

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];
}

30、單件實例是什麼?

  Foundation 和 Application Kit 框架中的一些類只容許建立單件對象,即這些類在當前進程中的惟一實例。舉例來講,NSFileManager 和NSWorkspace 類在使用時都是基於進程進行單件對象的實例化。當向這些類請求實例的時候,它們會向您傳遞單一實例的一個引用,若是該實例還不存在,則首先進行實例的分配 和初始化。 單件對象充當控制中心的角色,負責指引或協調類的各類服務。若是類在概念上只有一個實例(好比NSWorkspace),就應該產生 一個單件實例,而不是多個實例;若是未來某一天可能有多個實例,您可使用單件實例機制,而不是工廠方法或函數。

相關文章
相關標籤/搜索