在Objective C中设置静态变量(Setting static variables in Ob

2019-08-22 12:13发布

我似乎无法找到一种方法来设置我创建分配唯一的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;
}

Answer 1:

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

因此,我们有一个“类属性” - 它看起来,散步和叫声也像财产;-)



Answer 2:

如果你使用一个静态变量和你想子类此,静态变量将是双方父母和孩子一样,所以解决孩子上课时的任何变化,也将改变相同的“财产”上它的父。 (反之亦然)

安全的方式做到这一点是使用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);
}


Answer 3:

你不应该返回self.idGen因为int是不是属性。 如果你这样做你的代码应工作:

 + (int) idGen {
     static int idGen;
     return idGen;
   }


文章来源: Setting static variables in Objective C