iOS面試題二

1.深拷貝和淺拷貝的理解?

淺拷貝:只是對指針的拷貝,拷貝後兩個指針指向同一個內存空間

深拷貝:不但對指針進行拷貝,而且對指針指向的內容進行拷貝,經深拷貝後的指針是指向兩個不同地址的指針


對一個實例進行深拷貝時當前類需要實現NSCopying協議。

淺拷貝是複製出來一個跟原對象是同一地址的對象,而深拷貝則是複製出來一個跟源對象不同地址的對象,改變原對象,對新對象沒有影響。


2. 寫出方法獲取ios內存使用情況。

void logMemoryInfo()

  

3. 怎樣實現一個singleton的類

要實現單例,首先需要一個static的指向類本身的對象,其次需要一個初始化類函數。

1)@synchronized

static InstanceClass *instance;
+ (InstanceClass *)defaultInstance {
        @synchronized (self){
            if (instance == nil) {
                instance = [[InstanceClass alloc] init];
            }
        }
        return instance; 
}

2)GCD

static InstanceClass *instance;
+ (InstanceClass *)defaultInstance{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[InstanceClass alloc] init];
    });
    return instance;
}

 

4. 什麼是安全釋放?


把對象指針置爲nil,再對其釋放。


5.RunLoop是什麼?


runloop是事件接收和分發機制的一個實現,字面上來說,是線程中的循環

Runloops是線程的基礎架構部分。一個runloop就是一個事件處理循環,用來不停的調配工作以及處理輸入事件。使用run loop的目的是使你的線程在有工作的時候工作,沒有的時候休眠。

每個線程,包括程序的主線程(main thread)都有與之相應的run loop對象


6. 什麼是序列化和反序列化,可以用來做什麼?如何在OC中實現複雜對象的存儲?


把對象轉換爲字節序列的過程稱爲對象的序列化

把字節序列恢復爲對象的過程稱爲對象的反序列化

將對象寫到文件或者數據庫裏,並且可以讀取出來

遵循NSCoding協議,來實現複雜對象的存儲

實現該協議後就可以對其進行打包或者解包,然後轉化爲NSData


7.寫一個標準宏MIN,這個宏輸入兩個參數並返回較小的一個?

#define MIN(A,B) ((A)<(B)?(A):(B))



8. iphone os有沒有垃圾回收機制?簡單闡述一下OC內存管理。

沒有   引用計數機制

    1:對你自己擁有的對象負責.你只能釋放你擁有的對象.

    2:凡是你通過retain,alloc,copy等手段獲得了所有權的對象,都必須在你不再使用它的時候,,由你來調          用release,autorelease等手段來釋放對它的所有權.

    3:在一定的代碼段內,對同一個對象所作的copy,allocretain的次數應該與autoreleaserelease的         次數相等;

    4:可以在dealloc的方法中釋放你所佔有的實例變量.

    5:對於便利構造器和訪問器來說,你沒有通過上述的手段獲得對象的所有權,因此在這些情況下你無須對        獲得的對象進行額外的釋放操作.

    6:autorelease只不過意味着預定延遲發送一條release信息.當前的引用計數並沒有變.


9. 簡述應用程序按Home鍵進入後臺時的生命週期,以及從後臺回到前臺時的生命週期?


Home鍵進入後臺:

- (void)applicationWillResignActive:(UIApplication *)application{}

- (void)applicationDidEnterBackground:(UIApplication *)application{}

從後臺回到前臺:

- (void)applicationWillEnterForeground:(UIApplication *)application{}

- (void)applicationWillResignActive:(UIApplication *)application{}


10.ViewController alloc,loadView,ViewDidLoad,ViewWillAppear,ViewDidUnload,dealloc,init分別是在什麼時候調用的?在自定義ViewController的時候這幾個函數裏面應該做什麼工作?


alloc:申請內存空間的時候調用.

init:視圖初始化的時候,賦一些程序的初始值

LoadView:加載視圖的時候調用  self.view != nil的時候,執行loadview,加載一些自己的視圖

ViewDidLoad:視圖已經加載的時候調用(網絡數據之類的,刷新表之類)(添加通知)

ViewWillAppear:視圖將要出現的時候

ViewDidUnload:視圖已經卸載(數據釋放掉)(移除通知)

dealloc:視圖已經銷燬的時候(self.view = =nil)自己擁有的實例變量釋放掉





    


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章