也许这很明显,但我不知道如何在Objective-C中声明类属性。
我需要缓存每个类的字典,不知道如何把它放在类。
也许这很明显,但我不知道如何在Objective-C中声明类属性。
我需要缓存每个类的字典,不知道如何把它放在类。
当前回答
如果您正在寻找类级别的@property等价物,那么答案是“不存在这样的东西”。但请记住,@property只是语法糖;它只是创建适当命名的对象方法。
您希望创建访问静态变量的类方法,正如其他人所说,这些静态变量的语法略有不同。
其他回答
这里有一个线程安全的方法:
// 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—在应用程序的生命周期中执行一次且仅执行一次块对象。”
正如在WWDC 2016/XCode 8上看到的那样(LLVM会话@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
如果您正在寻找类级别的@property等价物,那么答案是“不存在这样的东西”。但请记住,@property只是语法糖;它只是创建适当命名的对象方法。
您希望创建访问静态变量的类方法,正如其他人所说,这些静态变量的语法略有不同。
属性在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;
}
你可以在Swift类中创建一个静态变量,然后从任何Objective-C类中调用它。