IOS總結(六)

weixin_34075551發表於2016-09-17

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有什麼不同?

相關文章