1.category和extension的區別
- category:分類有名字,類擴充套件沒有分類名字,是一種特殊的分類
- extension:分類只能擴充套件方法(屬性僅僅是宣告,並沒真正實現),類擴充套件可擴充套件屬性、成員變數和方法。
2.define和const常量有什麼區別?
- define在預處理階段進行替換,const常量在編譯階段使用
- 巨集不做型別檢查,僅僅進行替換,const常量有資料型別,會執行型別檢查
- define不能除錯,const常量可以除錯
- define定義的常量在替換後進行過程中會不斷用記憶體,而const定義的常量儲存在資料段只有一份copy,效率更高
- define可以定義一些簡單的函式,const不可以
3.block和weak修飾符的區別?
- __block不管是ARC還是MRC模式下都可以使用,可以修飾物件,也可以修飾基本資料型別
- __weak只能在ARC模式下使用,只能修飾物件(NSString),不能修飾基本資料型別
- block修飾的物件可以在block中被重新賦值,weak修飾的物件不可以
4.static關鍵字的左右
- 函式(方法)體內static變數的作用範圍為該函式體,該變數的記憶體只被分配一次,因此其值在下次呼叫時仍維持上次的值
- 在模組內的static全域性變數可以被模組內所用函式訪問,但不能被模組外其它函式呼叫;
- 在模組內的static函式只可被這一模組內的其它函式,這個函式的使用範圍被限制在宣告它的模組內;
- 在類中的static成員變數屬於整個類所擁有,對類的所有物件只有一份拷貝;
- 在類中的static成員函式所擁有,這個函式不接受this指標,因而只能訪問類的static成員變數
5.堆和棧的區別
- 對於棧來講,是由編譯器自動管理,無需我們手工控制;
- 對於堆來說,釋放工作由程式設計師控制,容易產生記憶體洩漏(memory leak)
- 從申請大小方面講
- 從資料儲存方面來講
- 棧空間中一般儲存基本型別,物件的地址
- 堆空間一般存放物件本身,block的copy等
6.ARC下還會存在記憶體洩漏嗎?
- Objective-C物件和CoreFoundation物件進行橋接的時候如果管理不當也會導致記憶體洩漏
- CoreFoundation中的物件不受ARC管理,需要開發者手動釋放
7.什麼情況使用weak關鍵字,相比assign有什麼不同?