如何在Objective-C中声明类级属性?

也许这是显而易见的,但我不知道如何在Objective-C中声明类属性。

我需要caching每类字典,并想知道如何把它放在课堂上。

属性在Objective-C中有特定的含义,但我认为你的意思是相当于一个静态variables的东西? 例如,所有types的Foo只有一个实例?

为了在Objective-C中声明类的function,你需要使用+前缀而不是 – 所以你的实现看起来像这样:

// Foo.h @interface Foo { } + (NSDictionary *)dictionary; // Foo.m + (NSDictionary *)dictionary { static NSDictionary *fooDict = nil; if (fooDict == nil) { // create dict } return fooDict; } 

我正在使用这个解决scheme:

 @interface Model + (int) value; + (void) setValue:(int)val; @end @implementation Model static int value; + (int) value { @synchronized(self) { return value; } } + (void) setValue:(int)val { @synchronized(self) { value = val; } } @end 

而且我发现它作为Singleton模式的替代品非常有用。

要使用它,只需用点符号访问你的数据:

 Model.value = 1; NSLog(@"%d = value", Model.value); 

如果您正在寻找@property的类级别,那么答案就是“没有这样的事情”。 但请记住, @property只是语法糖,无论如何, 它只是创build适当命名的对象方法。

你想要创build访问静态variables的类方法,正如其他人所说的那样,它们只有一个稍微不同的语法。

如WWDC 2016 / XCode 8( LLVM session @ 5:05中的新增内容 )所示。 类属性可以声明如下

 @interface MyType : NSObject @property (class) NSString *someString; @end NSLog(@"format string %@", MyType.someString); 

请注意,类属性从不合成

 @implementation static NSString * _someString + (NSString *)someString { return _someString; } + (void)setSomeString:(NSString *)newString { _someString = newString; } @end 

这是一个线程安全的方式:

 // Foo.h @interface Foo { } +(NSDictionary*) dictionary; // Foo.m +(NSDictionary*) dictionary { static NSDictionary* fooDict = nil; static dispatch_once_t oncePredicate; dispatch_once(&oncePredicate, ^{ // create dict }); return fooDict; } 

这些编辑确保fooDict只创build一次。

从Apple文档 :“dispatch_once – 在应用程序的整个生命周期内只执行一次块对象。”

属性只在对象中有值,而不在类中。

如果您需要为某个类的所有对象存储某些内容,则必须使用全局variables。 您可以通过在实现文件中将其声明为static来隐藏它。

你也可以考虑在你的对象之间使用特定的关系:你把一个master的angular色归类到你的类的一个特定的对象,并把其他的对象连接到这个master。 主人将字典作为一个简单的属性。 我想到了一个像Cocoa应用程序中用于视图层次结构的树。

另一种select是创build一个由“类”字典和与该字典相关的所有对象组成的专用类的对象。 这是像cocoa中的NSAutoreleasePool

从Xcode 8开始,Objective-C现在支持类属性:

 @interface MyClass : NSObject @property (class, nonatomic, assign, readonly) NSUUID* identifier; @end 

由于类属性永远不会合成,所以您需要编写自己的实现。

 @implementation MyClass static NSUUID*_identifier = nil; + (NSUUID *)identifier { if (_identifier == nil) { _identifier = [[NSUUID alloc] init]; } return _identifier; } @end 

您可以使用类名称上的普通点语法访问类属性:

 MyClass.identifier; 

如果你有很多类级别的属性,那么单身模式可能是有序的。 像这样的东西:

 // Foo.h @interface Foo + (Foo *)singleton; @property 1 ... @property 2 ... @property 3 ... @end 

 // Foo.m #import "Foo.h" @implementation Foo static Foo *_singleton = nil; + (Foo *)singleton { if (_singleton == nil) _singleton = [[Foo alloc] init]; return _singleton; } @synthesize property1; @synthesize property2; @synthesise property3; @end 

现在访问你的类级属性,如下所示:

 [Foo singleton].property1 = value; value = [Foo singleton].property2; 

[试试这个解决scheme很简单]你可以在Swift类中创build一个静态variables,然后从任何Objective-C类中调用它。