objective-c - iOS:为什么这个实例被释放?

标签 objective-c ios memory-management crash cocos2d-iphone

代码是:

if(!spriteInfoBack){
        spriteInfoBack = [CCSprite spriteWithFile:@"bg_player.png"];
        [spriteInfoBack setAnchorPoint:CGPointMake(0, 1)];
        [spriteInfoBack setPosition:CGPointMake(infoLeftX, infoTopY)];
        [parent addChild:spriteInfoBack];
}else{
        [spriteInfoBack setPosition:CGPointMake(infoLeftX, infoTopY)];
}

崩溃输出为:

[CCSprite setPosition:]: message sent to deallocated instance 0xc59cc70

它位于这一行:

[spriteInfoBack setPosition:CGPointMake(infoLeftX, infoTopY)];

我认为这很奇怪,因为 if(!spriteInfoBack) 已经检查了实例是否被释放。

最佳答案

您需要保留CCSprite。类方法 spriteWithFile 返回一个自动释放的对象。存储在 spriteInfoBack 中的返回值不属于您。这意味着对象的生命周期是直到下一个自动释放池被耗尽。从您的代码看来,您正在使用 spriteInfoBack 作为延迟初始化然后稍后使用的东西。您要做的是保留 spriteWithFile 的返回值,如下所示:

spriteInfoBack = [[CCSprite spriteWithFile:@"bg_player.png"] retain];

在未来的某个时候,您将需要发布 spriteInfoBack。我没有看到类的其余部分,但如果 spriteInfoBack 是类的实例变量,那么在 dealloc 中这样做是有意义的。

关于objective-c - iOS:为什么这个实例被释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8709356/

相关文章:

ios - VoiceLayer iOS obj c

iphone - 应用程序是否有可能并且有必要实现零内存泄漏?

c++ - 在这种情况下如何管理内存

c++ - 是否有安全/标准的方法来管理 C++ 中的非结构化内存?

ios - 如何从 iOS 设备获取唯一标识?

objective-c - 在 Objective-C 中将 NSArray 过滤成一个新的 NSArray

ios - UIViewController 中的 UISearchBar

ios - 动态改变容器的高度

ios - 如何从UI Xctest调用Appdelegate的 "OpenURL"函数

ios - 从另一个 View 删除现有数据