class property

在看文档的时候,发现 NSThread 的一个方法。

1
2
@property (readonly) BOOL isMainThread API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));
@property (class, readonly) BOOL isMainThread API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0)); // reports whether current thread is main

isMainThread 的属性是用了 class 关键字。这个关键字比较少见。查了下资料,叫做类属性。使用上并没有一些特殊的困难。比如需要手动生成 getter/setter 方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@interface TestManager : NSObject
@property (class, nonatomic, strong) NSString *name;
@end
static NSString *_name = nil;
@implementation TestManager
+ (NSString *)name {
return _name;
}
+ (void)setName:(NSString *)name {
_name = name;
}
@end

上述代码,是用 class 声明一个 name 属性。在使用上呢,其实就只是 点语法 而已。

1
2
TestManager.name = @"test";
NSLog(@"%@", TestManager.name);

也是挺简单的。

比如我们比较常见的单例,其实也可以用 class 属性来试下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@interface TestManager : NSObject
@property (class, nonatomic, readonly) TestManager *sharedInstance;
- (void)test;
@end
static TestManager *_shareInstance = nil;
@implementation TestManager
+ (TestManager *)sharedInstance {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_shareInstance = [[TestManager alloc] init];
});
return _shareInstance;
}
- (void)test {
NSLog(@"test");
}
@end
// 使用
[TestManager.sharedInstance test];

小小发现。记录下吧。又是一篇水文。(逃