1. 程式人生 > >OC例項方法和類方法建立的物件區別是什麼

OC例項方法和類方法建立的物件區別是什麼

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回收。