【问题标题】:noob here- objective C pointer having different addresses?这里的菜鸟 - 具有不同地址的目标 C 指针?
【发布时间】:2011-08-14 09:08:26
【问题描述】:
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 进入 memomr 并开辟一个空间。这个空间的地址保存在指针 msgg 中。

实例也在同一空间中创建。所以我希望地址保持不变。 但是我的控制台输出如下。请注意地址不同

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

【问题讨论】:

    标签: objective-c pointers memory-management


    【解决方案1】:

    在“普通”类中,这应该是正确的(但你不应该依赖它)。但是,对于 NSString(实际上是苹果的许多数据类: NSData、UIImage ),这个类实际上是一个“类集群”。您使用了一个名为“NSString”的对象,但您返回的类是一个秘密的其他类(很可能是 NSCFString)。 NSString 背后还有其他秘密类。当您分配一个 NSString 时,它会创建一个“虚拟”对象,然后当您使用特定值调用 init 时,它会确定它想要实际给您的秘密类(因此不同的地址)。

    一个更容易理解的例子是 UIImage。 UIImage 可以使用许多不同的图像类型(png、jpg 等)创建。对你来说,它看起来就像 UIImage,但是当你调用 init 时,它实际上会为你引用的每种类型的图像返回一个不同的子类。

    【讨论】:

    • 很好的解释。非常感谢!
    • @user726102 请注意,这种行为确实被类集群使用,但并不是它们独有的。
    【解决方案2】:

    不能保证+alloc 返回的实例与后续初始化程序返回的实例相同(例如-init)。

    例如,NSString 中的一个初始化器可能会返回一个已预先分配的文字字符串。在这种情况下,通过+alloc 创建的实例将被释放,而初始化程序则返回文字字符串的地址。

    【讨论】:

      【解决方案3】:

      我们总是嵌套-alloc 和-init 消息的原因是-init 不必返回self。返回一个新创建的对象是免费的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多