奇怪的行为 - 访问外部实例方法

时间:2011-04-20 09:28:34

标签: objective-c class methods cocos2d-iphone accessibility

嘿,嘿,再见 基本上,我有两个类: HudLayer和ConstructLayer。

我想从ConstructLayer访问HudLayer中的方法,以关闭/打开在HudLayer中分配的CCSprites的可见性属性。

HudLayer接口和实施:

HudLayer : CCLayer
@interface{
CCSprite *leftArrow;
CCSprite *rightArrow;
}
-(void)switcher:(BOOL)isVisible;
@end

@implementation
-(id)init{
//Create the Hud Sprites and add them at an arbitrary location

     leftArrow = [[[CCSprite alloc]init]retain];
     leftArrow = [CCSprite imageWithFile:@"file.png"];
     rightArrow = [[[CCSprite alloc]init]retain];
     rightArrow = [CCSprite imageWithFile:@"file.png"];

     leftArrow.visible = NO;
     rightArrow.visible = NO;

     [self addChild: leftArrow];
     [self addChild: rightArrow];
}

-(void)switcher:(BOOL)isVisible{
 NSLog (@"Accessed the visibility switcher");
    if (isVisible == NO){
         leftArrow.visible = NO;
         rightArrow.visible = NO;
    }

    if (isVisible == YES){
         leftArrow.visible = YES;
          rightArrow.visible = YES;
    }

@end

构建图层实现:

#import "HudLayer"  
@implementation ConstructLayer

-(void)someFunction{

  //Attempt to change the visibility of leftArrow and rightArrow

    HudLayer *hud = [[HudLayer alloc]init];
    [hud switcher: NO];
    [hud release];

}

这应该可行吗?但事实并非如此! 我访问[hud switcher:]方法但由于某种原因它不能正确设置属性CCSprite.visibility。
我把一个NSLog语句打印在我的控制台中,证明它正在访问它。 它真的很奇怪,我不知道它是怎么回事。 我甚至在这个函数中定义了变量并用NSLog打印它们就可以了......

1 个答案:

答案 0 :(得分:0)

这只是猜测,因为我没有cocos2d的经验,但无论如何......

我认为这部分真的很糟糕。你分配了(保留计数= 1),然后保留(保留计数= 2),然后完全忽略该对象并将你的变量指向另一个。

 leftArrow = [[[CCSprite alloc]init]retain];
 leftArrow = [CCSprite imageWithFile:@"file.png"];
 rightArrow = [[[CCSprite alloc]init]retain];
 rightArrow = [CCSprite imageWithFile:@"file.png"];

我猜你没看到精灵消失了。由于你在上面做了什么,你实际上可能正确地设置了可见属性,但是由于你创建了两个leftArrow和两个rightArrow对象,你可能只看到另一个(已分配,初始化和保留,没有指针。)

此外,imageWithFile可能正在返回一个自动释放的对象,您应该查看它。

编辑(我在下面的第二条评论):

替换

 leftArrow = [[[CCSprite alloc]init]retain];
 leftArrow = [CCSprite imageWithFile:@"file.png"];
 rightArrow = [[[CCSprite alloc]init]retain];
 rightArrow = [CCSprite imageWithFile:@"file.png"];

 leftArrow = [[CCSprite imageWithFile:@"file.png"] retain];
 rightArrow = [[CCSprite imageWithFile:@"file.png"] retain];