2011-04-28 82 views
3
NSString *msgg = [NSString alloc]; 
NSLog(@" address that msgg is holding is %p ", msgg); 
msgg = [msgg init]; 
NSLog(@" address that msgg is holding is %p ", msgg); 

現在alloc指的是客觀的c去記憶者並劃出一個空間。這個空間的地址被保存在指針msgg中。noob here-目標C指針具有不同的地址?

該實例也在相同的空間中創建。所以我期待地址保持不變。 但我的輸出到控制檯是follows.Please注意地址不同

BasicObjC[3064:10b] address that msgg is holding is 0x103340 
BasicObjC[3064:10b] address that msgg is holding is 0xa0289328 

回答

2

在「正常」類中,這應該是正確的(但不應該依賴它)。但是,對於NSString(實際上很多蘋果的數據類:NSData,UIImage),這個類實際上是一個「類集羣」。你使用一個名爲「NSString」的對象,但你得到的類是一個祕密的其他類(很可能是NSCFString)。 NSString後面還有其他的祕密類。當你分配一個NSString時,它產生一個「虛擬」對象,然後當你用一個特定的值調用init時,它決定了它想要實際給你的祕密類(因此是不同的地址)。

一個更容易理解的例子是UIImage。 UIImage可以用許多不同的圖像類型(PNG,JPG等)創建。對你來說它看起來像UIImage,但是當你調用init時,它實際上會爲你引用的每種類型的圖像返回一個不同的子類。

+0

很好的解釋。萬分感謝! – user726102 2011-04-28 04:14:25

+1

@ user726102請注意,這種行爲實際上是由類集羣使用的,但並不排除它們。 – 2011-04-28 04:17:00

2

有沒有保證,通過+alloc返回的實例是通過後續的初始化劑(例如,-init)返回相同的實例。

例如,NSString中的其中一個初始值可能會返回已預先分配的文字字符串。在這種情況下,通過+alloc創建的實例將被解除分配,並且初始化程序將返回文本字符串的地址。

1

我們總是嵌套-alloc和-init消息的原因是-init不必返回self。它可以自由地返回一個新創建的對象。