一次错误的总结(关于: 在实例方法和类方法公用一段代码)
一次错误的总结(关于: 在实例方法和类方法公用一段代码)
下面是在使用单例类中的一种常见,同时需要类方法getSinglePerson和实例方法init。其中都需要用到一段代码快:
1 NSString* className = NSStringFromClass([self class]);
2 NSLog(@"self class Name: %@",[self class]);
3 if ([className isEqualToString:@"Person"] == NO) {
4 NSLog(@"子类无法创建父类,因为父类是严格的单例类。");
5 NSParameterAssert(nil);
6 }
然后我就想把这部分独立出啦,让
-(void)prevent
{
NSString* className = NSStringFromClass([self class]);
NSLog(@"self class Name: %@",[self class]);
if ([className isEqualToString:@"Person"] == NO) {
NSLog(@"子类无法创建父类,因为父类是严格的单例类。");
NSParameterAssert(nil);
}
}
或者是
+(void)prevent
{
NSString* className = NSStringFromClass([self class]);
NSLog(@"self class Name: %@",[self class]);
if ([className isEqualToString:@"Person"] == NO) {
NSLog(@"子类无法创建父类,因为父类是严格的单例类。");
NSParameterAssert(nil);
}
}
使用,发现,类方法中不能调用实例方法,实例方法有时候也不能调用类方法(可能不对)。总之,模块化如果遇到实例方法和类方法都共用一段代码块,尽量不要将这一部分模块化出来。
1 #import "Person.h"
2
3 @implementation Person
4
5 Person* person = nil;
6 static int isGetSinglePerson = 0;
7
8
9 +(instancetype)getSinglePerson
10 {
11 static dispatch_once_t once;
12 dispatch_once(&once,^{
13 isGetSinglePerson = 1;
14 person = [[Person alloc] init];
15 });
16 // NSString* className = NSStringFromClass([self class]);
17 // NSLog(@"self class Name: %@",[self class]);
18 // if ([className isEqualToString:@"Person"] == NO) {
19 // NSLog(@"子类无法创建父类,因为父类是严格的单例类。");
20 // NSParameterAssert(nil);
21 // }
22 [self prevent];
23 return person;
24 }
25 -(instancetype)init
26 {
27 // NSString* className = NSStringFromClass([self class]);
28 // NSLog(@"self class Name: %@",[self class]);
29 // if ([className isEqualToString:@"Person"] == NO) {
30 // NSLog(@"子类无法创建父类,因为父类是严格的单例类。");
31 // NSParameterAssert(nil);
32 // }
33 [self prevent];
34 if (isGetSinglePerson == 1) {
35 self = [super init];
36 if (self) {
37 isGetSinglePerson = 0;
38 }
39 return self;
40 }else{
41 return person;
42 }
43 }
44 /**
45 * 防止子类调用的方法
46 */
47 -(void)prevent
48 {
49 NSString* className = NSStringFromClass([self class]);
50 NSLog(@"self class Name: %@",[self class]);
51 if ([className isEqualToString:@"Person"] == NO) {
52 NSLog(@"子类无法创建父类,因为父类是严格的单例类。");
53 NSParameterAssert(nil);
54 }
55 }
56
57 @end

浙公网安备 33010602011771号