一、#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從哪些方面進行流暢度優化?