也许这很明显,但我不知道如何在Objective-C中声明类属性。

我需要缓存每个类的字典,不知道如何把它放在类。


当前回答

这里有一个线程安全的方法:

// 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。

来自Apple文档:“dispatch_once—在应用程序的生命周期中执行一次且仅执行一次块对象。”

其他回答

我使用这个解决方案:

@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);

属性在Objective-C中有特定的含义,但我想你是指等价于静态变量的东西?例如,所有类型的Foo只有一个实例?

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

// Foo.h
@interface Foo {
}

+ (NSDictionary *)dictionary;

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

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

如果需要为类的所有对象存储一些内容,则必须使用全局变量。您可以通过在实现文件中声明它为静态来隐藏它。

您还可以考虑在对象之间使用特定的关系:将master角色属性为类的特定对象,并将其他对象链接到此master。master将把字典作为一个简单属性保存。我想到了可可应用程序中用于视图层次结构的树。

另一种选择是创建一个专用类的对象,该对象由您的“类”字典和与该字典相关的所有对象的集合组成。这类似于NSAutoreleasePool in Cocoa。

你可以在Swift类中创建一个静态变量,然后从任何Objective-C类中调用它。

这里有一个线程安全的方法:

// 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。

来自Apple文档:“dispatch_once—在应用程序的生命周期中执行一次且仅执行一次块对象。”