我似乎无法找到一种方法来设置我创建分配唯一的ID对每个对象我保存到持久性存储器中的静态int值。 下面让我对分配财产“无setter方法‘setIdGen’。
-(void)viewDidLoad
{
PlayerMenuController.idGen = [[NSUserDefaults standardUserDefaults] floatForKey:@"idGen"];
}
除了上面我已经尝试创建一个静态的setIdGen方法,将返回坏访问错误,并用自己的一套方法,使NSIntegers。 我的静态的NSMutableArray作出了同样的错误,当我尝试使用为其分配=,但使用setArray时工作得很好。
idGen方法:
+ (int) idGen
{
/*static int idGen;
if(!idGen)
{
idGen = 0;
NSLog(@"idGen reset");
}*/
return self.idGen;
}
2017年更新
xcode的8引入类属性的Objective-C,从发布说明:
Objective-C的现在支持类的属性,这与夫特型特性互操作。 他们被声明为@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
因此,我们有一个“类属性” - 它看起来,散步和叫声也像财产;-)
如果你使用一个静态变量和你想子类此,静态变量将是双方父母和孩子一样,所以解决孩子上课时的任何变化,也将改变相同的“财产”上它的父。 (反之亦然)
安全的方式做到这一点是使用objc / runtime.h关联的对象
+(int) idGen
{
NSNumber* idGen = objc_getAssociatedObject(self, @selector(idGen));
if (idGen == nil)
{
idGen = @0;
}
else
{
idGen = @([idGen intValue] + 1);
}
self.idGen = [idGen intValue];
return [idGen intValue];
}
+(void)setIdGen:(int)idGen
{
objc_setAssociatedObject(self, @selector(idGen), @(idGen), OBJC_ASSOCIATION_RETAIN);
}
你不应该返回self.idGen
因为int
是不是属性。 如果你这样做你的代码应工作:
+ (int) idGen {
static int idGen;
return idGen;
}