【问题标题】:Strange Behaviour - Accessing External Instance Method奇怪的行为 - 访问外部实例方法
【发布时间】:2011-04-20 09:28:33
【问题描述】:

嘿,再次,
基本上,我有两个课程: HudLayer 和 ConstructLayer。

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

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 打印它们,它工作了......

【问题讨论】:

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


    【解决方案1】:

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

    我认为这部分泄漏非常糟糕。您分配(保留计数 = 1),然后保留(保留计数 = 2),然后完全忽略该对象并将您的 var 指向另一个对象。

     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];
    

    【讨论】:

    • 我只添加了额外的分配来确保对象没有被释放。我做了实验并提出了这个:leftArrow = [[CCSprite spriteWithFile...] retain];这不起作用,任何其他组合也不起作用,我不知道为什么......
    • 您没有添加额外的分配。你创建了一个悬空对象,一个你没有指向的对象。试试帖子编辑部分的代码。
    • 哦,好吧。猜猜你必须从真正了解 cocos2d 的人那里获得帮助。 :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    相关资源
    最近更新 更多