2017 年更新
Xcode 8 向 Objective-C 引入了类属性,来自发行说明:
Objective-C 现在支持与 Swift 类型属性互操作的类属性。它们被声明为@property (class) NSString *someStringProperty;
,并且永远不会被合成。
这意味着我们下面的示例界面可以变成:
@interface PlayerMenuController : NSObject
@property (class) int idGen;
@end
但是,您仍然必须自己实现这些方法,如下所示,因为永远不会综合类属性。请注意,这也意味着如果您指定属性属性,例如copy
,您的方法必须实现语义。
原始答案
看起来你正在尝试实现一个类属性,但在 Objective-C 中没有这样的东西——一个属性是一对实例方法。
但是,你可以伪造它......
虽然@property
声明对您不可用,但如果您声明遵循正确命名约定的类方法,那么您的编译器可能(在 Xcode 4.6.1 上测试,“可能”,因为我不能直接指出支持这一点,但测试起来很简单如果没有,将编译时错误)允许您使用点表示法,即它看起来像一个类属性,即使它缺少@property
.
示例界面:
@interface PlayerMenuController : NSObject
// a class "property"
+ (int) idGen;
+ (void) setIdGen:(int)value;
@end
实施:
@implementation PlayerMenuController
static int idGen = 0;
+ (int) idGen { return idGen; }
+ (void) setIdGen:(int)value { idGen = value; }
@end
并测试它:
NSLog(@"initial value: %d", PlayerMenuController.idGen);
PlayerMenuController.idGen = 42;
NSLog(@"updated value: %d", PlayerMenuController.idGen);
生产:
initial value: 0
updated value: 42
所以我们有一个“类属性”——它看起来、走路和嘎嘎声都像一个属性;-)