盤點2016年iOS開發面試題及答案整理

     在現現在,隨着移動互聯網科技不斷的發展和創新,現在不管是公司仍是開發者或設計師我的而言,面試都是一項耗時耗錢的項目,而面對iOS開發者及設計師在面試時可能會遇到的問題進行了篩選與彙總。下面咱們一塊兒來一下吧。html

         一、簡述OC中內存管理機制。與retain配對使用的方法是dealloc仍是release,爲何?須要與alloc配對使用的方法是dealloc仍是release,爲何?readwrite,readonly,assign,retain,copy,nonatomic 、atomic、strong、weak屬性的做用?ios

         管理機制:使用了一種叫作引用計數的機制來管理內存中的對象。OC中每一個對象都對應着他們本身的引用計數,引用計數能夠理解爲一個整數計數器,當使用alloc方法建立對象的時候,持有計數會自動設置爲1。當你向一個對象發送retain消息 時,持有計數數值會增長1。相反,當你像一個對象發送release消息時,持有計數數值會減少1。當對象的持有計數變爲0的時候,對象會釋放本身所佔用的內存。面試

         retain(引用計數加1)->release(引用計數減1)數據庫

         alloc(申請內存空間)->dealloc(釋放內存空間)緩存

         readwrite: 表示既有getter,也有setter (默認)安全

         readonly: 表示只有getter,沒有setter網絡

         nonatomic:不考慮線程安全多線程

         atomic:線程操做安全 (默認)併發

         線程安全狀況下的setter和getter:app

         - (NSString*) value {

         @synchronized(self) {

         return [[_value retain] autorelease];

         }}

         (void) setValue:(NSString*)aValue {

         @synchronized(self) {

         [aValue retain];

         [_value release];

         _value = aValue;

         } }

         retain: release舊的對象,將舊對象的值賦予輸入對象,再提升輸入對象的索引計數爲1

         assign: 簡單賦值,不更改索引計數 (默認)

         copy: 實際上是創建了一個相同的對象,地址不一樣(retain:指針拷貝 copy:內容拷貝)

         strong:(ARC下的)和(MRC)retain同樣 (默認)

         weak:(ARC下的)和(MRC)assign同樣, weak當指向的內存釋放掉後自動nil化,防止野指針

         unsafe_unretained 聲明一個弱應用,可是不會自動nil化,也就是說,若是所指向的內存區域被釋放了,這個指針就是一個野指針了。
autoreleasing 用來修飾一個函數的參數,這個參數會在函數返回的時候被自動釋放。

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

         @private:做用範圍只能在自身類

         @protected:做用範圍在自身類和繼承本身的子類 (默認)

         @public:做用範圍最大,能夠在任何地方被訪問。

         @package:這個類型最經常使用於框架類的實例變量,同一包內能用,跨包就不能訪問

         三、線程是什麼?進程是什麼?兩者有什麼區別和聯繫?

         一個程序至少有一個進程,一個進程至少有一個線程:

         進程:一個程序的一次運行,在執行過程當中擁有獨立的內存單元,而多個線程共享一塊內存

         線程:線程是指進程內的一個執行單元。

         聯繫:線程是進程的基本組成單位

         區別:(1)調度:線程做爲調度和分配的基本單位,進程做爲擁有資源的基本單位
 (2)併發性:不只進程之間能夠併發執行,同一個進程的多個線程之間也可併發執行
 (3)擁有資源:進程是擁有資源的一個獨立單位,線程不擁有系統資源,但能夠訪問隸屬於進程的資源.
 (4)系統開銷:在建立或撤消進程時,因爲系統都要爲之分配和回收資源,致使系統的開銷明顯大於建立或撤消線程時的開銷。

         舉例說明:操做系統有多個軟件在運行(QQ、office、音樂等),這些都是一個個進程,而每一個進程裏又有好多線程(好比QQ,你能夠同時聊天,發送文件等)

         四、談談你對多線程開發的理解?ios中有幾種實現多線程的方法?

         好處:

         1.使用線程能夠把佔據時間長的程序中的任務放到後臺去處理

         2.用戶界面能夠更加吸引人,這樣好比用戶點擊了一個按鈕去觸發某些事件的處理,能夠彈出一個進度條來顯示處理的進度

         3.程序的運行速度可能加快

         4·在一些等待的任務實現上如用戶輸入、文件讀寫和網絡收發數據等,線程就比較有用了。

         缺點:

         1.若是有大量的線程,會影響性能,由於操做系統須要在它們之間切換。

         2.更多的線程須要更多的內存空間。

         3.線程的停止須要考慮其對程序運行的影響。

         4.一般塊模型數據是在多個線程間共享的,須要防止線程死鎖狀況的發生。

         實現多線程的方法:

        NSObject類方法

         NSThread

         NSOperation

         GCD

         五、線程同步和異步的區別?IOS中如何實現多線程的同步?

         異步:舉個簡單的例子 就是遊戲,遊戲會有圖像和背景音樂

         同步:是指一個線程要等待上一個線程執行完以後纔開始執行當前的線程,上廁所

         NSOperationQueue:maxcurrentcount

         NSConditionLock

         六、假設有一個字符串aabcad,請寫一段程序,去掉字符串中不相鄰的重複字符串,即上述字符串處理以後的輸出結果爲:aabcd

NSMutableString * str = [[NSMutableString alloc]initWithFormat;@「aabcad」];

         for (int i = 0 ,i < str.length - 1 ;i++){

         unsigned char a = [str characterAtIndex:i];

         for (int j = i + 1 ,j < str.length ,j++){

         unsigned char b = [str characterAtIndex:j];

         if (a == b ){

         if (j == i + 1){

         }else{

         [str deleteCharactersInRange:NSMakeRange(j, 1)];

         }

         }

         }

         }

         NSLog(@「%@」,str);

         七、獲取一臺設備惟一標識的方法有哪些?

         (1)UDID

         (2)UUID

        (3)MAC Address

                 (4)OPEN UDID

         (5)廣告標識符

         (6)Vindor標示符

         八、iOS類是否能夠多繼承?若是沒有,那能夠用其餘方法實現嗎?簡述實現過程。

         不能夠多繼承 用protocol實現

         九、堆和棧的區別?

         堆須要用戶手動釋放內存,而棧則是編譯器自動釋放內存

         問題擴展:要知道OC中NSString的內存存儲方式

         十、iOS本地數據存儲都有哪幾種方式?

         NSKeyedArchiver

         NSUserDefaults

        Write寫入方式

        SQLite3

         (問題擴展:什麼狀況下使用什麼樣的數據存儲)

         1.NSKeyedArchiver:採用歸檔的形式來保存數據,數據對象須要遵照NSCoding協議,對象對應的類必須提供encodeWithCoder:和initWithCoder:方法。缺點:只能一次性歸檔保存以及一次性解壓。因此只能針對小量數據,對數據操做比較笨拙,若是想改動數據的某一小部分,須要解壓或歸檔整個數據。

         2.NSUserDefaults:用來保存應用程序設置和屬性、用戶保存的數據。用戶再次打開程序或開機後這些數據仍然存在。NSUserDefaults能夠存儲的數據類型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。缺點:若是要存儲其餘類型,須要轉換爲前面的類型,才能用NSUserDefaults存儲。

         3.Write寫入方式:永久保存在磁盤中。第一步:得到文件即將保存的路徑:第二步:生成在該路徑下的文件:第三步:往文件中寫入數據:最後:從文件中讀出數據:

         4. SQLite:採用SQLite數據庫來存儲數據。SQLite做爲一中小型數據庫,應用ios中,跟前三種保存方式相比,相對比較複雜一些。

         十一、寫出方法獲取iOS內存使用狀況。

         // 獲取當前設備可用內存及所佔內存的頭文件

         #import

         #import

         // 獲取當前設備可用內存(單位: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;

         }

         十二、什麼是安全釋放?

         置nil 再釋放

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

         #define MIN(X,Y) ((X)>(Y)?(Y):(X))

         擴展:在定義宏的時候須要注意哪些問題?

         宏所有大寫 寫在#import 下 @interface上 結尾無分號

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

         iphone os沒有垃圾回收機制 oc的內存管理是誰建立誰釋放 程序中遇到retain 該對象引用計數+1 遇release該對象引用計數-1 retainCount爲0時 內存釋放

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

         本身能夠寫個demo來測試一下

         進入後臺時

         -(void)applicationWillResignActive:(UIApplication *)application;

         -(void)applicationDidEnterBackground:(UIApplication *)application;

         進入前臺時

         -(void)applicationDidEnterForeground:(UIApplication *)application;

         -(void)applicationWillResignActive:(UIApplication *)application;

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

         本身寫代碼測試加深理解

         alloc申請內存時調用

         loadView加載視圖時調用

         ViewDidLoad視圖已經加載後調用

         ViewWillAppear視圖將要出現時調用

         ViewDidUnload視圖已經加載但沒有加載出來調用

         dealloc銷燬該視圖時調用

         init視圖初始化時調用

         1七、描述應用程序的啓動順序。

         1. 程序入口main函數建立UIApplication實例和UIApplication代理實例。

         2. 在UIApplication代理實例中重寫啓動方法,設置第一ViewController。

         3. 在第一ViewController中添加控件,實現應用程序界面。

         1八、爲何不少內置類如UITableViewControl的delegate屬性都是assign而不是retain?請舉例說明。

         防止循環引用

         1九、使用UITableView時候必需要實現的幾種方法?

         -(NSInteger)tableView:(UITableView*)tableViewNumberOfRowsInSection:(NSInteger)section;
這個方法返回每一個分段的行數,不一樣分段返回不一樣的行數能夠用switch來作,若是是單個列表就直接返回單個你想要的函數便可。
-(UITableViewCell*)tableView:(UITableView*)tableViewCellForRowAtIndexPath:(NSIndexPath)indexPath;
這個方法是返回咱們調用的每個單元格。經過咱們索引的路徑的section和row來肯定

         20、寫一個便利構造器。

         //id表明任意類型指針,這裏表明Student *,類方法

         +(id)studentWithName:(NSString *)newName andAge:(int)newAge
{
 Student *stu=[[Student alloc]initName:newName andAge:newAge];
 return [stu autorelease];//自動釋放
}

         2一、UIImage初始化一張圖片有幾種方法?簡述各自的優缺點。

         3種

         imageNamed:系統會先檢查系統緩存中是否有該名字的Image,若是有的話,則直接返回,若是沒有,則先加載圖像到緩存,而後再返回。

         initWithContentsOfFile:系統不會檢查系統緩存,而直接從文件系統中加載並返回。

         imageWithCGImage:scale:orientation當scale=1

相關文章
相關標籤/搜索