1

我注意到,如果我将某些声明放在头文件的某些位置,则会出现编译错误。我已经在代码中添加了关于我认为某些事情的去向的注释;他们是正确的吗?

@interface Level : CCNode { 
    //Instance variables?
    PlayBackgroundLayer* playBGLayer;
    PlayUILayer* playUILayer;
    PlayElementLayer* playElementLayer;
}

//Static methods?
+(void) InitLevel: (int) levelNumber;
+(Level*) GetCurrentLevel;

//Property declarations for instance variables?
@property (nonatomic, retain) PlayBackgroundLayer* playBGLayer;
@end

//Static variables?
Level* currentLevel;
PlayTilemapLayer* playTilemapLayer;
4

2 回答 2

1

实例变量通常不需要显式声明。它们是在您@synthesize拥有财产时创建的。但是,如果您确实需要它们,则(新的)正确位置*位于实现块的顶部:

@implementation Level
{
    PlayBackgroundLayer* playBGLayer;
    PlayUILayer* playUILayer;
    PlayElementLayer* playElementLayer;
}

这些不是静态方法,它们是类方法,但是,是的,这就是你声明它们的地方。有些人喜欢将@property声明放在类方法之前,但这是见仁见智的问题。实例方法遵循这两种方法,尽管从技术上讲顺序并不重要——也就是说,编译器并不关心,这只是可读性的问题。

不过,这些顶级变量需要放在头文件以外的地方。如果你把它们放在那里,你会得到编译错误,因为每个导入头文件的文件都会重新声明这些变量的存储空间,这是不允许的。

通常您将这些变量放入 .m 文件中。如果您希望它们仅从那里可见,您将使用static. 如果您希望它们从导入标头的其他文件中可见,您可以离开static并在标头中声明变量extern

extern Level* currentLevel;

这让编译器知道变量的存储是在别处保留的。


*参见TOCPL 中的“类接口”

于 2012-06-13T01:30:20.480 回答
1

你在所有方面都是正确的,除了一个。您的最后一个变量不是静态变量,它们是全局变量。静态变量只是用 static 关键字声明的变量,它们的含义与其他语言略有不同。它们不是类变量,它们是仅对声明它们的文件可见的变量,并且只有在声明它的范围内才可见(如果您在函数中声明它,其他函数将看不到它)。但是,正如您所料,无论您有多少实例,它们都只声明一次。如果您在接口之外声明某些内容而没有像您所做的那样使用 static 关键字,其他类将导入它们。但是,这不是实现此目的的理想方法(如果多个类导入此标头,您可能会遇到重新定义错误)。

另外,需要注意的是,属性不需要有明确的支持变量(如果您使用@synthesize关键字,编译器将为您创建一个),但当然,如果您想要一个,它没有任何问题。

最后,您应该注意,您的静态方法 类方法不是实例方法的唯一原因是因为它们以加号 (+)字符而不是减号 (-)字符开头。

于 2012-06-13T01:30:32.897 回答