Cocos2d iphone 子类CCSpriteBatchNode对象为nil

Cocos2d iphone 子类CCSpriteBatchNode对象为nil,cocos2d-iphone,null,nscoding,ccspritebatchnode,Cocos2d Iphone,Null,Nscoding,Ccspritebatchnode,我将CCSpriteBatchNode子类化,以生成符合NSCoding的对象。我主要对CCSpriteBatchNode的字符串名称感兴趣。设置断点后,我意识到对象的字符串名称始终为零。我有一种感觉,我的重写方法可能是一个促成因素,但我不确定这一点。请参见以下相关代码: SpriteBatchNode接口: @interface SpriteBatchNode: CCSpriteBatchNode { NSString* batchImageName; } SpriteBatchNode实现

我将CCSpriteBatchNode子类化,以生成符合NSCoding的对象。我主要对CCSpriteBatchNode的字符串名称感兴趣。设置断点后,我意识到对象的字符串名称始终为零。我有一种感觉,我的重写方法可能是一个促成因素,但我不确定这一点。请参见以下相关代码:

SpriteBatchNode接口:

@interface SpriteBatchNode: CCSpriteBatchNode {
NSString* batchImageName;
}
SpriteBatchNode实现:

const NSUInteger defCapacity = 29;

@implementation SpriteBatchNode

@synthesize batchImageName;

+(id)batchNodeWithFile:(NSString*) imageFile
{
return [[self alloc] initWithFile:imageFile capacity:defCapacity];
}

-(id)initWithFile:(NSString *)fileImage {
self = [super initWithFile:fileImage capacity:defCapacity];

if (!self) return nil;

batchImageName = fileImage;

return self;
}

-(id)initWithCoder:(NSCoder *)aDecoder
{
NSString* spriteBatchNodeFileImage = [[aDecoder decodeObjectForKey:@"batchImageName"] copy];

self = [super initWithFile:spriteBatchNodeFileImage capacity:defCapacity];
if (!self) return nil;

return self;
}

-(void)encodeWithCoder:(NSCoder *)aCoder
{
   [aCoder encodeObject:batchImageName forKey:@"batchImageName"];
}

@end

如果不使用ARC,我在这里看到两个问题:

  • batchImageName字符串未保留
  • batchNodeWithFile:未向返回的实例发送自动释放
除了使用不寻常的init样式之外,常见的样式是:

if (self)
{
    batchImageName = fileImage;
}
return self;

检查self是否为nil,然后返回nil(如果是),这有点多余。

我正在使用ARC,我将init样式更改为上面的样式,但在日志中仍然得到相同的结果-
batchImageName=(NSString*)nil
何时何地记录?编码时是零还是解码后是零?在后一种情况下,发布启动解码的代码。