開始整理iOS職位面試問題及答案

Object-c的類能夠多重繼承麼?能夠實現多個接口麼?Category是什麼?重寫一個類的方式用繼承好仍是分類好?爲何?java

答: Object-c的類不能夠多重繼承;能夠實現多個接口,經過實現多個接口能夠完成C++的多重繼承;Category是類別,通常狀況用分類好,用Category去重寫類的方法,僅對本Category有效,不會影響到其餘類與原有類的關係。

  

#import 跟#include 又什麼區別,@class呢, #import<> 跟 #import」」又什麼區別?ios

答:#import是Objective-C導入頭文件的關鍵字,#include是C/C++導入頭文件的關鍵字,使用#import頭文件會自動只導入一次,不會重複導入,至關於#include和#pragma once;@class告訴編譯器某個類的聲明,當執行時,纔去查看類的實現文件,能夠解決頭文件的相互包含;#import<>用來包含系統的頭文件,#import」」用來包含用戶頭文件。

 

  

屬性readwrite,readonly,assign,retain,copy,nonatomic 各是什麼做用,在那種狀況下用?編程

 

1. readwrite 是可讀可寫特性;須要生成getter方法和setter方法時
2. readonly 是隻讀特性 只會生成getter方法 不會生成setter方法 ;不但願屬性在類外改變
3. assign 是賦值特性,setter方法將傳入參數賦值給實例變量;僅設置變量時;
4. retain 表示持有特性,setter方法將傳入參數先保留,再賦值,傳入參數的retaincount會+1;
5. copy 表示賦值特性,setter方法將傳入對象複製一份;須要徹底一份新的變量時。
6. nonatomic 非原子操做,決定編譯器生成的setter getter是不是原子操做,atomic表示多線程安全,通常使用nonatomic

 

  

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

- (void) setName:(NSString*) str {
  [str retain];
  [name release];
  name = str;
}
- (void)setName:(NSString *)str {   id t = [str copy];   [name release];   name = t; }

 

對於語句NSString*obj = [[NSData alloc] init]; obj在編譯時和運行時分別時什麼類型的對象?多線程

編譯時是NSString的類型;運行時是NSData類型的對象

 

  

常見的object-c的數據類型有那些, 和C的基本數據類型有什麼區別?如:NSInteger和int異步

 

object-c的數據類型有NSString,NSNumber,NSArray,NSMutableArray,NSData等等,這些都是class,建立後即是對象,而C語言的基本數據類型int,只是必定字節的內存空間,用於存放數值;NSInteger是基本數據類型,並非NSNumber的子類,固然也不是NSObject的子類。NSInteger是基本數據類型Int或者Long的別名(NSInteger的定義typedef long NSInteger),它的區別在於,NSInteger會根據系統是32位仍是64位來決定是自己是int仍是Long。

 

 

id 聲明的對象有什麼特性?atom

id 聲明的對象具備運行時的特性,便可以指向任意類型的objcetive-c的對象;

 

  

Object C中建立線程的方法是什麼?若是在主線程中執行代碼,方法是什麼?若是想延時執行代碼、方法又是什麼?spa

線程建立有三種方法:使用NSThread建立、使用GCD的dispatch、使用子類化的NSOperation,而後將其加入NSOperationQueue;在主線程執行代碼,方法是performSelectorOnMainThread,若是想延時執行代碼能夠用performSelector:onThread:withObject:waitUntilDone:

 

 

淺複製和深複製的區別?線程

答案:淺層複製:只複製指向對象的指針,而不復制引用對象自己。深層複製:複製引用對象自己。意思就是說我有個A對象,複製一份後獲得A_copy對象後,對於淺複製來講,A和A_copy指向的是同一個內存資源,複製的只不過是是一個指針,對象自己資源仍是隻有一份,那若是咱們對A_copy執行了修改操做,那麼發現A引用的對象一樣被修改,這其實違背了咱們複製拷貝的一個思想。深複製就好理解了,內存中存在了兩份獨立對象自己。用網上一哥們通俗的話將就是:淺複製比如你和你的影子,你完蛋,你的影子也完蛋深複製比如你和你的克隆人,你完蛋,你的克隆人還活着。

  

咱們說的oc是動態運行時語言是什麼意思?代理

答案:多態。 主要是將數據類型的肯定由編譯時,推遲到了運行時。這個問題其實淺涉及到兩個概念,運行時和多態。簡單來講,運行時機制使咱們直到運行時纔去決定一個對象的類別,以及調用該類別對象指定方法。多態:不一樣對象以本身的方式響應相同的消息的能力叫作多態。意思就是假設生物類(life)都用有一個相同的方法-eat;那人類屬於生物,豬也屬於生物,都繼承了life後,實現各自的eat,可是調用是咱們只需調用各自的eat方法。也就是不一樣的對象以本身的方式響應了相同的消息(響應了eat這個選擇器)。所以也能夠說,運行時機制是多態的基礎?~~~

  

通知和協議的不一樣之處?

答案:協議有控制鏈(has-a)的關係,通知沒有。首先我一開始也不太明白,什麼叫控制鏈(專業術語了~)。可是簡單分析下通知和代理的行爲模式,咱們大體能夠有本身的理解簡單來講,通知的話,它能夠一對多,一條消息能夠發送給多個消息接受者。代理按咱們的理解,到不是直接說不能一對多,好比咱們知道的明星經濟代理人,不少時候一個經濟人負責好幾個明星的事務。只是對於不一樣明星間,代理的事物對象都是不同的,一一對應,不可能說明天要處理A明星要一個發佈會,代理人發出處理髮佈會的消息後,別稱B的發佈會了。可是通知就不同,他只關心發出通知,而不關心多少接收到感興趣要處理。所以控制鏈(has-a從英語單詞大體能夠看出,單一擁有和可控制的對應關係。

  

frame和bounds有什麼不一樣?

答案:frame指的是:該view在父view座標系統中的位置和大小。(參照點是父親的座標系統)
bounds指的是:該view在自己座標系統中 的位置和大小。(參照點是自己座標系統)

 

NSOperation queue?

 

答案:存放NSOperation的集合類。操做和操做隊列,基本能夠當作java中的線程和線程池的概念。用於處理ios多線程開發的問題。網上部分資料提到一點是,雖然是queue,可是卻並非帶有隊列的概念,放入的操做並不是是按照嚴格的先進現出。這邊又有個疑點是,對於隊列來講,先進先出的概念是Afunc添加進隊列,Bfunc緊跟着也進入隊列,Afunc先執行這個是必然的,可是Bfunc是等Afunc徹底操做完之後,B纔開始啓動而且執行,所以隊列的概念離亂上有點違背了多線程處理這個概念。可是轉念一想其實能夠參考銀行的取票和叫號系統。所以對於A比B先排隊取票可是B率先執行完操做,咱們亦然能夠感性認爲這仍是一個隊列。可是後來看到一票關於這操做隊列話題的文章,其中有一句提到「由於兩個操做提交的時間間隔很近,線程池中的線程,誰先啓動是不定的。」瞬間以爲這個queue名字有點忽悠人了,還不如pool~綜合一點,咱們知道他能夠比較大的用處在於能夠幫組多線程編程就行了。

 

  

什麼是延遲加載?

答案:懶漢模式,只在用到的時候纔去初始化。也能夠理解成延時加載。我以爲最好也最簡單的一個列子就是tableView中圖片的加載顯示了。一個延時載,避免內存太高,一個異步加載,避免線程堵塞。
相關文章
相關標籤/搜索