Objective C静态类级别variables

我有一个class级电影,每个电影存储一个唯一的ID。 在C#,Java等我可以定义一个静态int currentID和每一次我设置ID我可以增加currentID和变化发生在类级别不是对象级别。 这可以在Objective C中完成吗? 我发现很难find答案。

问题描述

  1. 你想要你的ClassA有一个ClassB类的variables。
  2. 您正在使用Objective-C作为编程语言。
  3. Objective-C不像C ++那样支持类variables。

一个select

使用Objective-Cfunction模拟类variables行为

  1. 在classA.m中声明/定义一个静态variables,所以它只能用于classA方法(以及放在classA.m中的所有东西)。

  2. 覆盖NSObject初始化类方法,初始化静态variables与一个ClassB的实例。

  3. 你会想知道,为什么我应该覆盖NSObject的初始化方法。 关于这个方法的苹果文档有一个答案:“运行时发送初始化到程序中的每个类,恰好在类之前,或者从它inheritance的任何类,从程序中发送它的第一个消息(因此,方法可能永远不会被调用,如果类不使用)。

  4. 随意使用任何ClassA类/实例方法中的静态variables。

代码示例

文件:classA.m

static ClassB *classVariableName = nil; @implementation ClassA ... +(void) initialize { if (! classVariableName) classVariableName = [[ClassB alloc] init]; } +(void) classMethodName { [classVariableName doSomething]; } -(void) instanceMethodName { [classVariableName doSomething]; } ... @end 

参考文献

  1. 类variables解释了比较Objective-C和C ++方法

在你的.m文件中,你可以声明一个variables为静态的:

 static ClassName *variableName = nil; 

然后你可以在你的+(void)initialize方法上初始化它。

请注意,这是一个普通的C静态variables,并不是Java或C#认为的静态variables,但会产生类似的结果。

从Xcode 8开始,您可以在Obj-C中定义类属性。 这已被添加到与Swift的静态属性互操作。

Objective-C现在支持与Swifttypes属性互操作的类属性。 它们被声明为:@property(class)NSString * someStringProperty ;. 他们从来不合成。 (23891898)

这是一个例子

 @interface YourClass : NSObject @property (class, nonatomic, assign) NSInteger currentId; @end @implementation YourClass static NSInteger _currentId = 0; + (NSInteger)currentId { return _currentId; } + (void)setCurrentId:(NSInteger)newValue { _currentId = newValue; } @end 

那么你可以像这样访问它:

 YourClass.currentId = 1; val = YourClass.currentId; 

这是一个非常有趣的说明文章,我用作参考来编辑这个旧的答案。


2011答:(不要用这个,太可怕了)

如果你真的不想声明一个全局variables,还有另外一种select,可能不是非常正统:-),但工作…你可以像这样声明一个“get&set”方法,在里面有一个静态variables:

 + (NSString*)testHolder:(NSString*)_test { static NSString *test; if(_test != nil) { if(test != nil) [test release]; test = [_test retain]; } // if(test == nil) // test = @"Initialize the var here if you need to"; return test; } 

所以,如果你需要得到的价值,只要打电话:

 NSString *testVal = [MyClass testHolder:nil] 

然后,当你想要设置它:

 [MyClass testHolder:testVal] 

如果你想把这个伪静态testHolder设置为零,你可以这样声明testHolder

 + (NSString*)testHolderSet:(BOOL)shouldSet newValue:(NSString*)_test { static NSString *test; if(shouldSet) { if(test != nil) [test release]; test = [_test retain]; } return test; } 

和两个方便的方法:

 + (NSString*)test { return [MyClass testHolderSet:NO newValue:nil]; } + (void)setTest:(NSString*)_test { [MyClass testHolderSet:YES newValue:_test]; } 

希望它有帮助! 祝你好运。

在.m文件中,声明一个文件全局variables:

 static int currentID = 1; 

那么在你的init例程中,引用:

 - (id) init { self = [super init]; if (self != nil) { _myID = currentID++; // not thread safe } return self; } 

或者是否需要在其他时间更改(例如在openConnection方法中),然后在那里增加它。 记住它不是线程安全的,如果可能存在线程问题,则需要进行syncronization(或者更好的是,使用atomic add)。

正如pgb所说,没有“类variables”,只有“实例variables”。 实现类variables的objective-c方法是类的.m文件中的静态全局variables。 “静态”确保variables不能在该文件之外使用(即不能被外部使用)。

这里将是一个选项:

 +(int)getId{ static int id; //Do anything you need to update the ID here return id; } 

请注意,此方法将是唯一的方法来访问身份证,所以你将不得不在这个代码中以某种方式更新它。

(严格地说,不是对这个问题的回答,但根据我的经验,在寻找类variables时可能是有用的)

一个类方法通常可以扮演一个类variables在其他语言中的许多angular色(例如在testing期间改变了configuration):

 @interface MyCls: NSObject + (NSString*)theNameThing; - (void)doTheThing; @end @implementation + (NSString*)theNameThing { return @"Something general"; } - (void)doTheThing { [SomeResource changeSomething:[self.class theNameThing]]; } @end @interface MySpecialCase: MyCls @end @implementation + (NSString*)theNameThing { return @"Something specific"; } @end 

现在, MyCls类的一个对象调用Resource:changeSomething:在调用Resource:changeSomething:使用string@"Something general" ,而使用string@"Something specific"MySpecialCase派生的对象。

你可以将类重命名为classA.mm,并在其中添加C ++特性。

另一种可能性是有一个NSNumber子类的单身人士。