iOS面試題(答案)

1、 簡述OC中內存管理機制。與retain配對使用的方法是dealloc還是release,爲什麼?需要與alloc配對使用的方法是dealloc還是release,爲什麼?readwritereadonlyassignretaincopynonatomic atomicstrongweak屬性的作用? 
OC使用了一種叫做引用計數的機制來管理對象,如果對一個對象使用了alloc[Mutable]copyretain,那麼你必須使用相應的realease或者autorelease。也可以理解爲自己生成的對象,自己持有。非自己生成的對象,自己也能持有。不在需要自己持有的對象時釋放。非自己持有的對象無法釋放。生成並持有對象<alloc,new,copy,mutableCopy>,持有對象<retain>,釋放對象<release>,廢棄對象<dealloc>readwrite(默認):可讀可寫,表示既有getter方法,也有setter方法。readonly:表示只有getter方法,沒有setter方法。nonatomic:不考慮線程安全。atomic(默認):線程操作安全。strong(默認):ARC下和MRCretain一樣,weakARC下):和(MRC)assign類似,區別是當weak指向的內存釋放掉後自動置爲nil,防止野指針。

unsafe_unretained聲明一個若引用,但不會自動置爲nil,可能會出現野指針。

線程安全下的settergetter方法:

- (NSString *value{

@synchronizedself{

return [[_value retain] autorelease];

}

}

- (void)setValue:(NSString *)aValue{

@synchronized(self){

[aValue retain];

[_value release];

_value = aValue;

}

}

2、類變量的@protected ,@private,@public,@package聲明各有什麼含義?
上面的幾個聲明表明的時類成員的作用域,@private作用範圍只能在自身類(外界既不可訪問,又不能繼承);@protected作用範圍在自身類和子類,如果什麼都不加修飾,默認是@protected(外界不可訪問,但是可以繼承);@public作用範圍最大,可以在任何地方被訪問(外界即可訪問,又可以繼承);@package作用範圍在某個框架內

3、 談談你對多線程開發的理解?ios中有幾種實現多線程的方法?
好處:
(1)使用線程可以把程序中佔據時間長的任務放到後臺去處理,如圖片、視頻的下載
(2)發揮多核處理器的優勢,併發執行讓系統運行的更快、更流暢,用戶體驗更好
缺點:
(1)大量的線程降低代碼的可讀性,
(2)更多的線程需要更多的內存空間
(3)當多個線程對同一個資源出現爭奪的時候要注意線程安全的問題。
iOS有三種多線程編程的技術:
(1)NSThread(兩種創建方式)
[NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:self withObject:nil];
NSThread *myThread = [[NSThread alloc] initWithTarget:self selector:@selector(doSomething:) object:nil];

[myThread start];
(2)NSOperationQueue

NSOperationQueue *oprationQueue = [[NSOperationQueue alloc] init];

oprationQueue addOperationWithBlock:^{

//這個block語句塊在子線程中執行

}

http://alloc.sinaapp.com/wp/?p=237

(3)Grand Central Dispatch (GCD)

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    // 耗時的操作

    dispatch_async(dispatch_get_main_queue(), ^{

        // 更新界面

    });

});

http://blog.csdn.net/totogo2010/article/details/8016129

 

PS:不顯示的創建線程的方法:
NSObject的類方法  performSelectorInBackground:withObject: 創建一個線程:
[Obj performSelectorInBackground:@selector(doSomething) withObject:nil];

4、 iOS本地數據存儲都有哪幾種方式?iOS如何實現複雜對象的存儲?

(1) NSKeyedArchiver(歸檔)採用歸檔的形式來保存數據,該數據對象需要遵守NSCoding協議,並且該對象對應的類必須提供encodeWithCoder:initWithCoder:方法

(2) NSUserDefaults:用來保存應用程序設置和屬性、用戶保存的數據。用戶再次打開程序或開機後這些數據仍然存在。NSUserDefaults可以存儲的數據類型包括:NSDataNSStringNSNumberNSDateNSArrayNSDictionary

(3) Write寫入方式:永久保存在磁盤中。

(4) SQLiteFMDBCoreData

NSCoding + NSKeyedArchiver實現複雜對象的存儲。

5、 iOS的動態性
iOS的動態性來自三個方面:動態類型、動態綁定、動態載入、SEL類型 

(1)動態類型<弱類型>id):在代碼的運行階段判斷代碼的類型,使用id類型可以讓應用在“運行時”使用任何類型來替換。動態類型讓程序更加靈活,但是會使數據的統一性降低和代碼的可讀性。我們常用靜態類型<強類型>(如NSString,使用靜態類型編譯器可以完全分析你的代碼,這讓代碼的性能和可預知性更高。
(2)動態綁定:讓代碼在運行時判斷需要調用什麼方法,而不是在編譯時。 動態類型和動態綁定使得選擇哪個接收者已經調用什麼方法都放到運行時去完成。    

(3)動態載入:應用程序可以根據需要加載可執行代碼以及資源,而不是在啓動時就加載所有資源。

(4)SEL類型 iOS在編譯的時候會根據方法的名字(包括參數序列),生成一個用來區分這個方法的唯一的ID,這個IDSEL類型的,SEL的本質就是類方法的編號[函數地址]。(類似C語言裏面的函數指針,但是OC的類不能直接使用函數指針,這樣只能做一個@selector語法來取。注意:@selector是查找當前類(含子類)的方法。

6、寫出方法獲取ios內存使用情況。
// 獲取當前設備可用內存及所佔內存的頭文件

#import <sys/sysctl.h>

#import <mach/mach.h>

// 獲取當前設備可用內存(單位:MB

- (double)availableMemory

{

  vm_statistics_data_t vmStats;

  mach_msg_type_number_t infoCount = HOST_VM_INFO_COUNT;

  kern_return_t kernReturn = host_statistics(mach_host_self(), 

                                             HOST_VM_INFO

                                             (host_info_t)&vmStats, 

                                             &infoCount);

  

  if (kernReturn != KERN_SUCCESS) {

    return NSNotFound;

  }

  

  return ((vm_page_size *vmStats.free_count) / 1024.0) / 1024.0;

}

 

// 獲取當前任務所佔用的內存(單位:MB

- (double)usedMemory

{

  task_basic_info_data_t taskInfo;

  mach_msg_type_number_t infoCount = TASK_BASIC_INFO_COUNT;

  kern_return_t kernReturn = task_info(mach_task_self(), 

                                       TASK_BASIC_INFO

                                       (task_info_t)&taskInfo, 

                                       &infoCount);

 

  if (kernReturn != KERN_SUCCESS

      ) {

    return NSNotFound;

  }

  

  return taskInfo.resident_size / 1024.0 / 1024.0;}

7、什麼是安全釋放?

在對象release之後把指針置爲nil,但不是絕對的安全釋放,只是理論上。

8、 RunLoop是什麼?
一個RunLoop就是一個時間處理的循環,用來不停的調度工作以及處理輸入時間。使用runloop的目的是讓你的線程在有工作的時候忙於工作,而沒工作的時候處於休眠狀態。runloop的設計是爲了減少cpu無謂的空轉。

9、什麼是序列化和反序列化,可以用來做什麼?如何在OC中實現複雜對象的存儲?
如果你需要存儲一個複雜的對象的話,經常要以二進制的方法序列化這個對象,這個過程叫Archiving。如果一個對象需要進行序列化,那麼需要遵循NScoding協議,主要有兩個方法:
-(id)initWithCoder:(NSCoder*)coder;//coder中讀取數據,保存到相應變量中,即反序列化數據。
-(void)encodeWithCoder:(NSCoder*)coder;//讀取實例變量,並把這些數據寫到coder中去,即序列化數據。

10、 iphone os有沒有垃圾回收機制?簡單闡述一下OC內存管理。
iphone os沒有垃圾回收機制。
垃圾回收機制用於在空閒時間以不定時的方式動態的回收無任何引用的對象佔據的內存空間。





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