从 iPhone 和 Cocos2d 中的类类型(+)方法访问对象?

Posted

技术标签:

【中文标题】从 iPhone 和 Cocos2d 中的类类型(+)方法访问对象?【英文标题】:Accessing an Object from Class type(+) method in iPhone & Cocos2d? 【发布时间】:2012-01-31 08:45:49 【问题描述】:

我有一个类方法,我在其中创建和返回类对象。 但我想在同一个类中访问该对象的某些属性。作为一个类方法,我不能在 .h 文件中声明变量,然后在其他方法中访问它。以下是代码 如何在下面的实例方法中访问 backsprite 或 hudlayer 对象的值??

    // class 1

+(id)HUDWithBackgroundSprite:(NSString *)spriteName withRect:(CGRect)rect atPoistion:(HUDPosition)pos


  HUDlayer *hud = [[HUDlayer alloc] init];

  CCSprite *backSprite = [CCSprite spriteWithFile:spriteName];
  [backSprite setContentSize:CGSizeMake(rect.size.width,rect.size.height)];
  [backSprite setPosition:ccp(rect.origin.x,rect.origin.y)];
  [backSprite setTag:100];
  [hud addChild:backSprite];
  [hud setTag:2];

  return [hud autorelease];



// access it here

-(void)AddButtonToHUDWithImage:(NSString *)imageName selector:(SEL)selector withDisabledImage:(NSString *)disbdImageName

  HUDlayer *hud = (HUDlayer *)[self getChildByTag:2];

  CCMenuItem *menuItem1 = [CCMenuItemImage itemFromNormalImage:imageName selectedImage:imageName disabledImage:disbdImageName target:self selector:@selector(selector)];

  CCMenu *menu = [CCMenu menuWithItems:menuItem1,nil];

  CCSprite *sprite = (CCSprite *)[hud getChildByTag:100];

  CGPoint pos = sprite.position;
  //pos =[[CCDirector sharedDirector]convertToGL:pos];

  [menu setPosition:ccp(pos.x+160,pos.y-30)];

  [hud addChild:menu];


// class 2

+(CCScene *) scene

  // 'scene' is an autorelease object.
  CCScene *scene = [CCScene node];

    HUDlayer *hud = [HUDlayer node];
  //  [scene addChild:hud z:1];

  // 'layer' is an autorelease object.
  HelloWorldLayer *layer = [[[HelloWorldLayer alloc]initWithHUD:hud]autorelease];

  // add layer as a child to scene 
  [scene addChild: layer];

  id mainHuds = [HUDlayer HUDWithBackgroundSprite:HUDBackground withRect:CGRectMake(160,450, 300,60) atPoistion:pos_Top];

  SEL callOnClick;
  [mainHuds AddButtonToHUDWithImage:ButtonBackground selector:callOnClick withDisabledImage:disabledBackground];

  [scene addChild: mainHuds];

  // return the scene
  return scene;

我无法通过标签访问它,因为这里没有添加 + 方法中的 HUDlayer 对象,而是在调用该方法的另一个类中。

【问题讨论】:

我不太明白.. 为什么不能在 .h 文件中声明它?访问的唯一方法是变量是否在 .h 文件中.. 不,这将是一个实例变量,不会在类方法中访问.. 仅在实例方法中 【参考方案1】:

如果您有指向该类实例的指针/引用,则您绝对可以在类的静态方法中访问该类的实例/成员变量。这是一个简单的例子...抱歉,如果有错别字...

// HUDLayer.h

@interface HUDLayer : CCLayer

    NSString* aString;


@property (nonatomic, retain) NSString* aString;

+(void)modifyInstanceString:(HUDLayer*)hud;

// HUDLayer.m

@implementation HUDLayer

@synthesize aString;

-(id)init

    if ((self=[super init]))
    
        self.aString = @"initial value";
    
    CCLOG(@"Initial value = %@", self.aString);
    return self;


+(void)modifyInstanceString:(HUDLayer*)hud

    hud.aString = @"Something else";
    CCLOG(@"Modified aString via static method = %@", hud.aString);


@end

// HelloWorldLayer.m(或任何地方)

HUDLayer* hud = [[HUDLayer alloc] init];
[HUDLayer modifyInstanceString:hud];

【讨论】:

【参考方案2】:

没有理由不能在 .h 文件中将对象声明为变量:

HUDlayer *hud;

这正是该类的方法访问它的方式。如果您遇到错误,我只能假设您的 .h 文件的布局是错误的。我通常这样设置场景和图层:

@interface ExampleLayer : CCLayer
       
        //vars


//methods

@end

@interface ExampleScene : CCScene 
   
    ExampleLayer *layer;


@end

【讨论】:

【参考方案3】:

静态方法中只能使用静态变量... 将 .h 文件中的对象声明为 Static HUDlayer *hud; 并使用类名访问它... 仍然 M 无法理解您为什么要创建这么多静态方法,因为它们非常繁重并且即使您不需要该类也是预加载的......

【讨论】:

static methods(或类方法)中只能使用静态变量是不准确的。在堆上分配的对象可以在这里使用。如果它将该对象引用返回给调用者,然后添加到视图层次结构中(并隐式保留),以后的例程可以从层次结构中检索。 在 jer answer 的帮助下找到了一个更好的方法。我猜只有两种静态方法可以解决

以上是关于从 iPhone 和 Cocos2d 中的类类型(+)方法访问对象?的主要内容,如果未能解决你的问题,请参考以下文章

cocos2D for iPhone 和触摸检测的问题

我的第一个 iPhone 的 Cocos2d 应用程序中的问题?

升级到 Cocos2d 2.1 后 AppDelegate 报错

cocos2d iphone中的FBconnect问题?

cocos2d iPhone中的循环背景

适用于iPhone的Cocos2d中的整数对