Objective-C在声明对象时实际上做了什么?

Ste*_*eve 8 memory-management objective-c ios

我已经阅读了Apple的内存管理指南,我看不出这个案例的解释...

很多时候,特别是在编写类方法来返回类的实例时,我会像这样开始,因为这就是我看到它完成的方式,并且它有效.

[注意]这段代码来自内存 - 当我回到家里展示一个真正有用的例子时我会更新它(我做了这个来说明它,但显然我不记得它很好地构造了一些有意义的东西...

[编辑]这是我的实际方法 - 当然每个人都是对的,我必须打电话给alloc我.

+ (id)player
{
    Player *player = nil;
    if ((player = [[[super alloc] initWithFile:@"rocket.png"] autorelease])) {
    [player setProjectileType:kProjectileBullet];
        [player setProjectileLevel:1];
        [player setInvincible:YES];
        [player setEmitter:[CCParticleSystemQuad particleWithFile:@"exhaust.plist"]];
        [[player emitter] setPosition:ccp(0.0, player.contentSize.height/2)];
        [player addChild:player.emitter];
    }
    return player;
}
Run Code Online (Sandbox Code Playgroud)

所以我从响应中得到的是:*声明实例只是给我一个指向内存位置的指针,并告诉Xcode该对象将是什么类.*将指针设置为nil几乎只是将其设置为零 - 保持它没有垃圾(对吧?)*由于我自动释放实例,返回的对象也是自动释放的.

谢谢你帮我理解这个!

ser*_*gio 11

有人可以解释编译器在看到这个时会做什么吗?

    DooDad* aDooDad = nil;
Run Code Online (Sandbox Code Playgroud)

如果您真的对编译器的作用感兴趣,答案是:编译器将在堆栈上为局部变量保留一些内存aDooDad,这是一种指针类型(根据处理器的不同,通常为64或32位).然后将该指针初始化为包含nil(通常0x00..00).

这样的陈述:

         DooDad* aDooDad = [[DooDad alloc] init...];
Run Code Online (Sandbox Code Playgroud)

利用指针变量aDooDad将地址存储在进一步分配的对象的内存中(这是保留的内存地址alloc).

所以,最后,

    DooDad* aDooDad = nil;
Run Code Online (Sandbox Code Playgroud)

不是声明一个对象,只是一个变量,其内容被解释为DooDad类型对象的地址.因此,这样的声明就像您知道的任何其他声明一样,例如在初始化int为0时,以便稍后您可以在if语句中为其分配一些值.

声明如下:

 [aDooDad doSomething];
Run Code Online (Sandbox Code Playgroud)

由Objective-C运行时系统解释,如:将消息发送doSomething到存储地址的对象aDooDad.如果该地址nil没有发送消息.另一方面,如果你取消引用一个nil指针:*aDooDad你会得到未定义的行为.

指针是相当低级的东西.我希望这有帮助.