objective-c - [[NSDictionary alloc] init]后引用计数是几
黄舟
黄舟 2017-04-21 10:57:37
0
1
448
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,第二個應該是。 。 。沒準,反正一般比 1 大。
原因是這樣的:
當你初始化一個 NSDictionary 實例以後,這個實例就不可變了,也就是說這東西一旦產生,那麼在記憶體中的資訊就是固定的。而 objective-c 為了節省內存,會把所有這種不可變的,相同實例的指針指向同一塊內存。所以,當你 dictB 初始化一個空 NSDictionary 的時候,並沒有真的去創建一個新的實例,而是指向了歷史上已經存在的實例,而這個實例的 RC 加1。
你第一個 dictA 創建的對象,看起來不會有重複的對象,所以是一個新的實例,如果你這樣

NSDictionary *dictC =[[NSDictionary alloc] initWithObjectsAndKeys:@"1",@"two", nil];
NSLog(@"dictC retain count is %d",[dictC retainCount]);

那麼這個印出來就應該是2了,是 dictA 的 RC + 1 。

與之對應的,Mutable 的實例,就不會有這種情況,每次新建都是一個新實例,因為他在生命週期裡隨時會改變。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板