iOS面試題 -總結 ,你的基礎紮實嗎?

一、#import和#include的區別,@class表明什麼?ios

  

(1)#import指令是Object-C針對#include的改進版本,#import確保引用的文件只會被引用一次,這樣你就不會陷入遞歸包含的問題中。web

(2)#import與@class兩者的區別在於:算法

#import會鏈入該頭文件的所有信息,包括實體變量和方法等;而@class只是告訴編譯器,其後面聲明的名稱是類的名稱,至於這些類是如何定 義的,暫時不用考慮。在頭文件中, 通常只須要知道被引用的類的名稱就能夠了。 不須要知道其內部的實體變量和方法,因此在頭文件中通常使用@class來聲明這個名稱是類的名稱。 而在實現類裏面,由於會用到這個引用類的內部的實體變量和方法,因此須要使用#import來包含這個被引用類的頭文件。緩存

在編譯效率方面考慮,若是你有100個頭文件都#import了同一個頭文件,或者這些文件是依次引用的,如A–>B, B–>C, C–>D這樣的引用關係。當最開始的那個頭文件有變化的話,後面全部引用它的類都須要從新編譯,若是你的類有不少的話,這將耗費大量的時間。而是用 @class則不會。安全

若是有循環依賴關係,如:A–>B, B–>A這樣的相互依賴關係,若是使用#import來相互包含,那麼就會出現編譯錯誤,若是使用@class在兩個類的頭文件中相互聲明,則不會 有編譯錯誤出現。因此,通常來講,@class是放在interface中的,只是爲了在interface中引用這個類,把這個類做爲一個類型來用的。 在實現這個接口的實現類中,若是須要引用這個類的實體變量或者方法之類的,仍是須要import在@class中聲明的類進來.網絡

二、淺拷貝和深拷貝區別是什麼?多線程

淺拷貝app

淺拷貝就是對內存地址的複製,讓目標對象指針和源對象指向同一片內存空間。如:框架

1
2
char* str = (char*)malloc(100);
char* str2 = str;

淺拷貝只是對對象的簡單拷貝,讓幾個對象共用一片內存,當內存銷燬的時候,指向這片內存的幾個指針須要從新定義纔可使用,要否則會成爲野指針。tcp

iOS 裏面的淺拷貝:

在 iOS 裏面, 使用retain 關鍵字進行引用計數,就是一種更加保險的淺拷貝。他既讓幾個指針共用同一片內存空間,又能夠在release 因爲計數的存在,不會輕易的銷燬內存,達到更加簡單使用的目的。

深拷貝:

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

copy 與 retain 的區別:

copy 是建立一個新對象,retain 是建立一個指針,引用對象計數加一。 copy屬性標識兩個對象內容相同,新的對象retain count爲1, 與舊有對象引用計數無關,舊有對象沒有變化。copy減小對象對上下文的依賴。

iOS裏的深拷貝:

iOS提供了copy和mutableCopy方法,顧名思義,copy就是複製了一個imutable的對象,而mutableCopy就是複製了一個mutable的對象。如下將舉幾個例子來講明。
這裏指的是NSString, NSNumber等等一類的對象。

1
2
3
4
NSString *string = @」dddd";
NSString *stringCopy = [string copy];
NSMutableString *stringDCopy = [string mutableCopy];
[stringMCopy appendString:@ "!!" ];

查看內存能夠發現,string和stringCopy指向的是同一塊內存區域(weak reference),引用計數沒有發生改變。而stringMCopy則是咱們所說的真正意義上的複製,系統爲其分配了新內存,是兩個獨立的字符串內容是同樣的。

拷貝構造:

固然在 ios 中並非全部的對象都支持copy,mutableCopy,遵照NSCopying協議的類能夠發送copy消息,遵照NSMutableCopying協議的類才能夠發送mutableCopy消息。

假 如發送了一個沒有遵照上訴兩協議而發送copy或者 mutableCopy,那麼就會發生異常。可是默認的ios類並無遵照這兩個協議。若是想自定義 一下copy 那麼就必須遵照NSCopying,而且實現 copyWithZone: 方法,若是想自定義一下mutableCopy 那麼就必須遵 守NSMutableCopying,而且實現 mutableCopyWithZone: 方法。

若是是咱們定義的對象,那麼咱們本身要實現NSCopying , NSMutableCopying這樣就能調用copy和mutablecopy了。舉個例子:

1
2
3
4
5
6
7
8
@interface MyObj : NSObject<NSCopying, NSMutableCopying>{
     NSMutableString *_name;
     NSString * _imutableStr ;
     int _age;
}     
@property (nonatomic, retain) NSMutableString *name;
@property (nonatomic, retain) NSString *imutableStr;
@property (nonatomic) int age;

copy拷貝構造:

1
2
3
4
5
6
7
- (id)copyWithZone:(NSZone *)zone{
     MyObj *copy = [[[self class] allocWithZone :zone] init];
     copy->name = [_name copy];
     copy->imutableStr = [_imutableStr copy];
     copy->age = age;
     return  copy;
}

mutableCopy拷貝構造:

 

1
2
3
4
5
6
- (id)mutableCopyWithZone:(NSZone *)zone{
     MyObj *copy = NSCopyObject(self, 0, zone);
     copy->name = [_name mutableCopy];
     copy->age = age;
     return  copy;
}

三、Objective-C中類別和類擴展的區別?

四、Objective-C堆和棧的區別?

五、內存管理的幾個原則是什麼?

六、NSMuatableArray *array = [NSMuatableArray array] 須要釋放麼?

七、@property本質是什麼

八、delegate用什麼屬性修飾,ARC下與MRC下有何不一樣,爲何?

九、NSString,NSArray,NSMutableArray分別用什麼屬性修飾,緣由是什麼?

十、block用什麼屬性修飾,爲何?

十一、__block與__weak的區別是什麼?

十二、assign與weak的區別是什麼?

1三、分別寫一個setter方法

完成@property(nonatomic,retain)NSString *name和@property(nonatomic,copy)NSString *name

1四、@autoreleasepool {for (long i = 0; i < largeNumber; i++) {Person *per = [[Person alloc] init];[per autorelease];}}有什麼內存問題,如何改正?

1五、如何寫一個單例?

1六、post與get的區別?

1七、Http與tcp,udp的區別?

1八、http都設置哪些header?

1九、http與https的區別?

20、網絡七層協議(http,tcp/ip處於哪一層)?

2一、經常使用多線程方式有哪些?

2二、NSOperation比GCD有哪些優勢,如何處理線程依賴

2三、runloop與線程的關係

2四、runtime的理解

2五、在實際項目中遇到過死鎖麼?如何處理死鎖問題

2六、runloop有幾種模式,runloop接收幾種輸入源

2七、如何處理滑動UI過程當中,廣告輪播圖中止輪詢問題,使用runloop的哪一種模式

2八、有一個需求,須要將N個請求所有完成以後執行某個操做,該如何處理

2九、weak會有性能開銷麼?使用什麼代替

30、autorelease pool的原理是什麼

3一、runloop的原理

3二、runloop與autoreleasepool的關係

3三、block會延長對象的生命週期麼?

3四、SSL加密流程

3五、網絡加密方式有哪些,各自的原理

3六、AFnetworking原理

3七、SDWebImage框架原理以及是如何作圖片緩存的

3八、冒泡排序/快速排序算法

3九、CALayer與UIView的區別是什麼?

40、iOS有幾種動畫,各自是什麼?

4一、用熟悉的動畫寫一個移動的動畫

4二、instancetype與id的區別

4三、如何進行代碼適配

4四、xib如何處理動態view佈局

4五、如何處理webview與js之間交互

4六、本身自定義一個輪播圖

4七、如何進行熱修復?

4八、對MVVM的理解以及如何實踐

4九、如何進行自動化打包?

50、如何對網絡請求進行二次封裝

5一、好比開發人員要打發布包與企業包,如何在不修改bundle id的狀況下快速打包?

5二、block比delegate有哪些優缺點

5三、FMDB是線程安全的麼?

5四、tableview從哪些方面進行流暢度優化?

相關文章
相關標籤/搜索