2011-04-20 61 views
0

嘿再次,
基本上,我有兩個類: 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他們和它的工作...

回答

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

我只加了額外的撥款,以確保被釋放的對象wasnt。 我試驗過,並把這個:leftArrow = [[CCSprite spriteWithFile ...] retain]; 這不工作,也沒有任何其他組合,我不知道爲什麼... – Ospho 2011-04-21 01:40:24

+0

你沒有添加額外的分配。你創建了一個懸掛對象,你沒有指針。嘗試在帖子的編輯部分的代碼。 – Altealice 2011-04-21 03:31:55

+0

感謝您的回覆,我確實嘗試過,並且它不起作用:( – Ospho 2011-04-22 03:12:35