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的意思是objective c进入memomr并划分出一个空间。此空间的地址保存在指针msgg中。
实例也在相同的空间中创建。所以我希望地址保持不变。
但我对控制台的输出如下。请注意地址不同
BasicObjC[3064:10b]  address that msgg is holding is 0x103340
BasicObjC[3064:10b]  address that msgg is holding is 0xa0289328

最佳答案

在“普通”类中,这应该是正确的(但您不应该依赖它)。但是,对于nsstring(实际上是苹果的许多数据类:nsdata,uiimage),这个类实际上是一个“类集群”。您使用一个名为“nsstring”的对象,但是您返回的类是一个秘密的其他类(很可能是nscfstring)。nsstring后面还有其他秘密类。当您分配一个nsstring时,它会生成一个“伪”对象,然后当您用一个特定的值调用init时,它会确定它想要实际给您的秘密类(因此地址不同)。
一个更容易理解的例子是uiimage。可以使用许多不同的图像类型(png、jpg等)创建uiimage。对您来说,它看起来就像uiimage,但是当您调用init时,它实际上会为您引用的每种类型的图像返回一个不同的子类。

09-11 17:35