OC例項方法和類方法建立的物件區別是什麼
阿新 • • 發佈:2019-02-05
arrayWithArray和initWithArray的區別
建立一個數組的時候經常使用初始化方法initWithArray或者便利構造方法arrayWithArray來建立,比如:
NSArray *arr = @[@"1"];
NSMutableArray *arr1 = [NSMutableArray arrayWithArray:arr];
NSMutableArray *arr2 = [[NSMutableArray alloc] initWithArray:arr];
NSLog(@"%ld %lu",(long)arr1.retainCount,(long)arr2.retainCount );//1 1
在MRC環境下,建立兩個陣列arr1和arr2,arr1通過類方法也就是便利構造方法建立,arr2通過例項方法建立的。兩種建立可變陣列的方法有什麼區別呢?
例項方法和類方法
例項方法
例項方法就是要用例項物件去呼叫的方法。
陣列arr2通過alloc後呼叫的例項方法initWithArray。
類方法(便利構造方法/工廠方法)
類方法是用類直接呼叫。
陣列arr1是通過NSMutableArray這個類直接呼叫arrayWithArray返回一個例項arr1。
記憶體管理方面
- 在MRC下
通過例項方法建立的物件,需要用該例項呼叫release方法來使得物件的retainCount減減,當物件的retainCount減為0的時候,系統會將其放入最近一次迴圈(runloop)的釋放池中,即將該物件回收。
也就是說,通過例項方法建立的物件,需要手動去進行記憶體管理。否則就會出現記憶體問題。
通過類方法建立的物件則不需要手動去管理記憶體,即不需要例項去release操作。
- 在ARC下
建立的物件,當物件的引用計數為0時候,系統將物件放入最近的一次迴圈中的自動釋放池中,回收該物件。
小demo親測
建立一個MRC環境的專案,寫之前陣列建立的方法程式碼,然後用Product->Analyze分析記憶體問題,如下截圖所示:
報錯資訊:
1. Method returns an instance of NSMutableArray with a +1 retain count
2. Object leaked: object allocated and stored into 'arr2' is not referenced later in this execution path and has a retain count of +1
Potential leak of an object stored into 'arr2'
分析結果很明確,arr1不呼叫release方法也沒有什麼問題,當然呼叫了也可以的。但是arr2是通過例項方法建立的物件,需要手動呼叫release方法來使引用計數減1,才能被autoreleasepool回收。