NSDictionary *dictA =[[NSDictionary alloc] initWithObjectsAndKeys:@"1",@"two", nil]; NSLog(@"dictA retain count is %d",[dictA retainCount]); NSDictionary *dictB =[[NSDictionary alloc] init]; NSLog(@"dictB retain count is %d",[dictB retainCount]);
问:NSLog出来分别是几?为什么?
首先,兩個輸出,第一個應該是 1,第二個應該是。 。 。沒準,反正一般比 1 大。
原因是這樣的:
當你初始化一個 NSDictionary 實例以後,這個實例就不可變了,也就是說這東西一旦產生,那麼在記憶體中的資訊就是固定的。而 objective-c 為了節省內存,會把所有這種不可變的,相同實例的指針指向同一塊內存。所以,當你 dictB 初始化一個空 NSDictionary 的時候,並沒有真的去創建一個新的實例,而是指向了歷史上已經存在的實例,而這個實例的 RC 加1。
你第一個 dictA 創建的對象,看起來不會有重複的對象,所以是一個新的實例,如果你這樣
那麼這個印出來就應該是2了,是 dictA 的 RC + 1 。
與之對應的,Mutable 的實例,就不會有這種情況,每次新建都是一個新實例,因為他在生命週期裡隨時會改變。