guorenbao iOS筆試題總結(如有錯誤,請指正)

1.深拷貝和淺拷貝的區別。

答:淺拷貝只是對對象的簡單拷貝,讓幾個對象共用一片內存,當內存銷毀的時候,指向這片內存的幾個指針需要重新定義才可以使用,要不然會成為野指針;

深拷貝是指拷貝對象的具體內容,而內存地址是自主分配的,拷貝結束之后,兩個對象雖然存的值是相同的,但是內存地址不一樣,兩個對象也互不影響,互不干涉。

2.static關鍵字的作用(函數體/模塊/類中)

答:1>在函數體內,一個被聲明為靜態的變量在這一函數被調用過程中維持其值不變(該變量存放在靜態變量區)。

2>在模塊內(但在函數體外),一個被聲明為靜態的變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問。它是一個本地的全局變量。

在模塊內,一個被聲明為靜態的函數只可被這一模塊內的其它函數調用。那就是,這個函數被限制在聲明它的模塊的本地范圍內使用。

3>在類中的static成員變量意味著它為該類的所有實例所共享,也就是說當某個類的實例修改了該靜態成員變量,其修改值為該類的其它所有實例所見;

3.線程和進程的區別和聯系。

答:進程和線程都是由操作系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的并發性。

程和線程的主要差別在于它們是不同的操作系統資源管理方式。進程有獨立的地址空間,一個進程崩潰后,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不同執行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等于整個進程死掉,所以多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對于一些要求同時進行并且又要共享某些變量的并發操作,只能用線程,不能用進程。

4.什么是KVC和KVO。

答:1>KVC:鍵 - 值編碼是一種間接訪問對象的屬性使用字符串來標識屬性,而不是通過調用存取方法,直接或通過實例變量訪問的機制。

2>KVO,即:Key-Value Observing,它提供一種機制,當指定的對象的屬性被修改后,則對象就會接受到通知。簡單的說就是每次指定的被觀察的對象的屬性被修改后,KVO就會自動通知相應的觀察者了。

5.什么是懶加載?使用過的例子。

答:懶加載,也稱為延遲加載,即在需要的時候才加載(效率低,占用內存小)。在程序啟動的時候不加載資源,只有在運行當需要一些資源時,再去加載這些資源。

例如加載一個label:重寫label的getter方法

-(UILabel *)label{

//判斷是否已經有了,若沒有,則進行實例化

if(!_label) {

_label=[[UILabel alloc]initWithFrame:CGRectMake(20,400,300,30)];

[_lastlab setTextAlignment:NSTextAlignmentCenter];

[self.view addSubview:_label];

}

return _label;

}

6.socket連接和http連接的區別。

答:HTTP協議:簡單對象訪問協議,對應于應用層? ,HTTP協議是基于TCP連接的

?TCP協議:????對應于傳輸層

IP協議:? ? 對應于網絡層

TCP/IP是傳輸層協議,主要解決數據如何在網絡中傳輸;而HTTP是應用層協議,主要解決如何包裝數據。

Socket是對TCP/IP協議的封裝,Socket本身并不是協議,而是一個調用接口(API),通過Socket,我們才能使用TCP/IP協議。

http連接:http連接就是所謂的短連接,即客戶端向服務器端發送一次請求,服務器端響應后連接即會斷掉;

socket連接:socket連接就是所謂的長連接,理論上客戶端和服務器端一旦建立起連接將不會主動斷掉;但是由于各種環境因素可能會是連接斷開,比如說:服務器端或客戶端主機down了,網絡故障,或者兩者之間長時間沒有數據傳輸,網絡防火墻可能會斷開該連接以釋放網絡資源。所以當一個socket連接中沒有數據的傳輸,那么為了維持連接需要發送心跳消息~~具體心跳消息格式是開發者自己定義的

我們已經知道網絡中的進程是通過socket來通信的,那什么是socket呢?socket起源于Unix,而Unix/Linux基本哲學之一就是“一切皆文件”,都可以用“打開open –>?讀寫write/read –>?關閉close”模式來操作。我的理解就是Socket就是該模式的一個實現,socket即是一種特殊的文件,一些socket函數就是對其進行的操作(讀/寫IO、打開、關閉),這些函數我們在后面進行介紹。我們在傳輸數據時,可以只使用(傳輸層)TCP/IP協議,但是那樣的話,如果沒有應用層,便無法識別數據內容,如果想要使傳輸的數據有意義,則必須使用到應用層協議,應用層協議有很多,比如HTTP、FTP、TELNET等,也可以自己定義應用層協議。WEB使用HTTP協議作應用層協議,以封裝HTTP文本信息,然后使用TCP/IP做傳輸層協議將它發到網絡上。

1)Socket是一個針對TCP和UDP編程的接口,你可以借助它建立TCP連接等等。而TCP和UDP協議屬于傳輸層?。

而http是個應用層的協議,它實際上也建立在TCP協議之上。

(HTTP是轎車,提供了封裝或者顯示數據的具體形式;Socket是發動機,提供了網絡通信的能力。)

2)Socket是對TCP/IP協議的封裝,Socket本身并不是協議,而是一個調用接口(API),通過Socket,我們才能使用TCP/IP協議。Socket的出現只是使得程序員更方便地使用TCP/IP協議棧而已,是對TCP/IP協議的抽象,從而形成了我們知道的一些最基本的函數接口。

7.?OC中加號方法和減號方法的區別。

答:前置?加號(+)的方法為類方法,這類方法是可以直接用類名來調用的,它的作用主要是創建一個實例。有人把它稱為創建實例的工廠方法。

前置?減號(-)的方法為實例方法,必須使用類的實例才可以調用的。

8.OC中有沒有多繼承?如果沒有用什么方法代替?

答:沒有。

雖然Objective-C在語法上禁止類使用多繼承,但是在協議的遵守上卻允許使用多繼承。所以可以用協議來實現多繼承。

現在ClassC需要繼承ClassA中methodA、ClassB中methodB,具體的代碼實現為:

//定義ClassA以及其methodA

@interface ClassA : NSObject {

}

-(void)methodA;

@end

//定義ClassB以及其methodB

@interface ClassB : NSObject {

}

-(void)methodB;

@end

//定義ClassC以及其需要的methodA,methodB

@interface ClassC : NSObject {

ClassA *a;

ClassB *b;

}

-(id)initWithA:(ClassA *)A b:(ClassB *)B;

-(void)methodA;

-(void)methodB;

@end

//注意在ClassC的實現

@implementation ClassC

-(id)initWithA:(ClassA *)A b:(ClassB *)B{

a=[[ClassA alloc] initWithClassA: A];//[A copy];

b=[[ClassB alloc] initWithClassB: B];//[B copy];

}

-(void)methodA{

[a methodA];

}

-(void)methodB{

[b methodB];

}

上面是采用組合的方式實現了多繼承的功能,解決了Objective-C不能多繼承的語法

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1.寫一個NSString類的實現 +(id)initWithCString:(c*****t char *)nu...
    韓七夏閱讀 3,798評論 2 37
  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛閱讀 2,013評論 0 7
  • 轉自 iOS 面試常見問題最全梳理 序言 目前形勢,參加到iOS隊伍的人是越來越多,甚至已經到供過于求了。今年,找...
    ZMJun閱讀 809評論 0 11
  • ———————————————回答好下面的足夠了---------------------------------...
    恒愛DE問候閱讀 1,759評論 0 4
  • 一直不太喜歡雞湯文,總覺著那就是麻痹人的大腦,很多了看完雞湯文就像真的打了雞血一樣,瞬間相信成功在等著自己,愛情在...
    Betty來自未來閱讀 253評論 0 0