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

來源:互聯網
上載者:User

標籤:

     在現如今,隨著移動互連網科技不斷的發展和創新,如今無論是公司還是開發人員或設計師個人而言,面試都是一項耗時耗錢的項目,而面對iOS開發人員及設計師在面試時可能會遇到的問題進行了篩選與匯總。下面我們一起來一下吧。

         1、簡述OC中記憶體管理機制。與retain配對使用的方法是dealloc還是release,為什麼?需要與alloc配對使用的方法是dealloc還是release,為什麼?readwrite,readonly,assign,retain,copy,nonatomic 、atomic、strong、weak屬性的作用?

         管理機制:使用了一種叫做引用計數的機制來管理記憶體中的對象。OC中每個對象都對應著他們自己的引用計數,引用計數可以理解為一個整數計數器,當使用alloc方法建立對象的時候,持有計數會自動化佈建為1。當你向一個對象發送retain訊息 時,持有計數數值會增加1。相反,當你像一個對象發送release訊息時,持有計數數值會減小1。當對象的持有計數變為0的時候,對象會釋放自己所佔用的記憶體。

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

         alloc(申請記憶體空間)->dealloc(釋放記憶體空間)

         readwrite: 表示既有getter,也有setter (預設)

         readonly: 表示只有getter,沒有setter

         nonatomic:不考慮安全執行緒

         atomic:線程操作安全 (預設)

         安全執行緒情況下的setter和getter:

         - (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 用來修飾一個函數的參數,這個參數會在函數返回的時候被自動釋放。

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

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

         @protected:作用範圍在自身類和繼承自己的子類 (預設)

         @public:作用範圍最大,可以在任何地方被訪問。

         @package:這個類型最常用於架構類的執行個體變數,同一包內能用,跨包就不能訪問

         3、線程是什麼?進程是什麼?二者有什麼區別和聯絡?

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

         進程:一個程式的一次運行,在執行過程中擁有獨立的記憶體單元,而多個線程共用一塊記憶體

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

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

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

         舉例說明:作業系統有多個軟體在運行(QQ、office、音樂等),這些都是一個個進程,而每個進程裡又有好多線程(比如QQ,你可以同時聊天,傳送檔案等)

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

         好處:

         1.使用線程可以把佔據時間長的程式中的任務放到後台去處理

         2.使用者介面可以更加吸引人,這樣比如使用者點擊了一個按鈕去觸發某些事件的處理,可以彈出一個進度條來顯示處理的進度

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

         4·在一些等待的任務實現上如使用者輸入、檔案讀寫和網路收發資料等,線程就比較有用了。

         缺點:

         1.如果有大量的線程,會影響效能,因為作業系統需要在它們之間切換。

         2.更多的線程需要更多的記憶體空間。

         3.線程的中止需要考慮其對程式啟動並執行影響。

         4.通常塊模型資料是在多個線程間共用的,需要防止線程死結情況的發生。

         實現多線程的方法:

        NSObject類方法

         NSThread

         NSOperation

         GCD

         5、線程同步和非同步區別?IOS中如何?多線程的同步?

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

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

         NSOperationQueue:maxcurrentcount

         NSConditionLock

         6、假設有一個字串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);

         7、擷取一台裝置唯一標識的方法有哪些?

         (1)UDID

         (2)UUID

        (3)MAC Address

                 (4)OPEN UDID

         (5)廣告標識符

         (6)Vindor標示符

         8、iOS類是否可以多繼承?如果沒有,那可以用其他方法實現嗎?簡述實現過程。

         不可以多繼承 用protocol實現

         9、堆和棧的區別?

         堆需要使用者手動釋放記憶體,而棧則是編譯器自動釋放記憶體

         問題擴充:要知道OC中NSString的記憶體儲存方式

         10、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中,跟前三種儲存方式相比,相對比較複雜一些。

         11、寫出方法擷取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;

         }

         12、什麼是安全釋放?

         置nil 再釋放

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

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

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

         宏全部大寫 寫在#import 下 @interface上 結尾無分號

         14、iphone os有沒有記憶體回收機制?簡單闡述一下OC記憶體管理。

         iphone os沒有記憶體回收機制 oc的記憶體管理是誰建立誰釋放 程式中遇到retain 該對象引用計數+1 遇release該對象引用計數-1 retainCount為0時 記憶體釋放

         15、簡述應用程式按Home鍵進入後台時的生命週期,以及從後台回到前台時的生命週期?

         自己可以寫個demo來測試一下

         進入後台時

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

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

         進入前台時

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

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

         16、ViewController 的 alloc,loadView, viewDidLoad,viewWillAppear,viewDidUnload,dealloc、init分別是在什麼時候調用的?在自訂ViewController的時候這幾個函數裡面應該做什麼工作?

         自己寫代碼測試加深理解

         alloc申請記憶體時調用

         loadView載入視圖時調用

         ViewDidLoad視圖已經載入後調用

         ViewWillAppear視圖將要出現時調用

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

         dealloc銷毀該視圖時調用

         init視圖初始化時調用

         17、描述應用程式的啟動順序。

         1. 程式入口main函數建立UIApplication執行個體和UIApplication代理執行個體。

         2. 在UIApplication代理執行個體中重寫啟動方法,設定第一ViewController。

         3. 在第一ViewController中添加控制項,實現應用程式介面。

         18、為什麼很多內建類如UITableViewControl的delegate屬性都是assign而不是retain?請舉例說明。

         防止循環參考

         19、使用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];//自動釋放?}

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

         3種

         imageNamed:系統會先檢查系統緩衝中是否有該名字的Image,如果有的話,則直接返回,如果沒有,則先載入映像到緩衝,然後再返回。

         initWithContentsOfFile:系統不會檢查系統緩衝,而直接從檔案系統中載入並返回。

         imageWithCGImage:scale:orientation當scale=1

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.