1. 描述一種在Swift中出現循環引用的情況,并說明怎么解決。
循環引用出現在當兩個實例對象相互擁有強引用關系的時候,這會造成內存泄露,
原因是這兩個對象都不會被釋放, 都在等待對方釋放。解決方式:打破循環引用
用weak或者unowned引用代替其中一個的強引用,來打破循環引用。
2. tableView的重用機制?
UITableView 通過重用單元格來達到節省內存的目的: 通過為每個單元格指定一個重用標識符,即指定了單元格的種類,當屏幕上的單元格滑出屏幕時,系統會把這個單元格添加到重用隊列中,等待被重用,當有新單元格從屏幕外滑入屏幕內時,從重用隊列中找看有沒有可以重用的單元格,如果有,就拿過來用,如果沒有就創建一個來使用。
3. 一般是怎么用Instruments的?
Instruments里面工具很多,常用:
1). Time Profiler: 性能分析
2). Zombies:檢查是否訪問了僵尸對象,但是這個工具只能從上往下檢查,不智能。
3). Allocations:用來檢查內存,寫算法的那批人也用這個來檢查。
4). Leaks:檢查內存,看是否有內存泄露。
4. lldb(gdb)常用的控制臺調試命令?
1). p 輸出基本類型。是打印命令,需要指定類型。是print的簡寫
p (int)[[[self view] subviews] count]
2). po 打印對象,會調用對象description方法。是print-object的簡寫
po [self view]
3). expr 可以在調試時動態執行指定表達式,并將結果打印出來。常用于在調試過程中修改變量的值。
4). bt:打印調用堆棧,是thread backtrace的簡寫,加all可打印所有thread的堆棧
5). br l:是breakpoint list的簡寫
5. delegate 和 notification 的區別
1). 二者都用于傳遞消息,不同之處主要在于一個是一對一的,另一個是一對多的。
2). notification通過維護一個array,實現一對多消息的轉發。
3). delegate需要兩者之間必須建立聯系,不然沒法調用代理的方法;notification不需要兩者之間有聯系。
6. 是怎么檢查內存泄露?
1). 靜態分析 analyze。
2). instruments工具里面有個leak可以動態分析。
7. 如何對iOS設備進行性能測試?
Profile-> Instruments ->Time Profiler
8. ViewController生命周期
按照執行順序排列:
- initWithCoder:通過nib文件初始化時觸發。
- awakeFromNib:nib文件被加載的時候,會發生一個awakeFromNib的消息到nib文件中的每個對象。
- loadView:開始加載視圖控制器自帶的view。
- viewDidLoad:視圖控制器的view被加載完成。
- viewWillAppear:視圖控制器的view將要顯示在window上。
- updateViewConstraints:視圖控制器的view開始更新AutoLayout約束。
- viewWillLayoutSubviews:視圖控制器的view將要更新內容視圖的位置。
- viewDidLayoutSubviews:視圖控制器的view已經更新視圖的位置。
- viewDidAppear:視圖控制器的view已經展示到window上。
- viewWillDisappear:視圖控制器的view將要從window上消失。
- viewDidDisappear:視圖控制器的view已經從window上消失。
9. oc 系統對象的 copy 與 mutableCopy 方法
一、非集合類對象的copy與mutableCopy
在非集合類對象中,對不可變對象進行copy操作,是指針復制,mutableCopy操作是內容復制;
對可變對象進行copy和mutableCopy都是內容復制。用代碼簡單表示如下:
NSString *str = @"hello word!";
NSString *strCopy = [str copy] // 指針復制,strCopy與str的地址一樣
NSMutableString *strMCopy = [str mutableCopy] // 內容復制,strMCopy與str的地址不一樣
NSMutableString *mutableStr = [NSMutableString stringWithString: @"hello word!"];
NSString *strCopy = [mutableStr copy] // 內容復制
NSMutableString *strMCopy = [mutableStr mutableCopy] // 內容復制
二、集合類對象的copy與mutableCopy (同上)
在集合類對象中,對不可變對象進行copy操作,是指針復制,mutableCopy操作是內容復制;
對可變對象進行copy和mutableCopy都是內容復制。但是:集合對象的內容復制僅限于對象本身,對集合內的對象元素仍然是指針復制。(即單層內容復制)
NSArray *arr = @[@[@"a", @"b"], @[@"c", @"d"];
NSArray *copyArr = [arr copy]; // 指針復制
NSMutableArray *mCopyArr = [arr mutableCopy]; //單層內容復制
NSMutableArray *array = [NSMutableArray arrayWithObjects:[NSMutableString stringWithString:@"a"],@"b",@"c",nil];
NSArray *copyArr = [mutableArr copy]; // 單層內容復制
NSMutableArray *mCopyArr = [mutableArr mutableCopy]; // 單層內容復制
【總結一句話】:
只有對不可變對象進行copy操作是指針復制(淺復制),其它情況都是內容復制(深復制)!
10. Category(類別)、 Extension(擴展)和繼承的區別
- 分類有名字,類擴展沒有分類名字,是一種特殊的分類。
- 分類只能擴展方法(屬性僅僅是聲明,并沒真正實現),類擴展可以擴展屬性、成員變量和方法。
- 繼承可以增加,修改或者刪除方法,并且可以增加屬性。
11. 怎么定義數組
var arry:[String] = [] 或 var arr:Array<String> = Array<String>()
12. 淺拷貝和深拷貝的區別?
淺拷貝:只復制指向對象的指針,而不復制引用對象本身。
深拷貝:復制引用對象本身。內存中存在了兩份獨立對象本身,當修改A時,A_copy不變。