一次错误的总结(关于:在实例方法和类方法公用一段代码)

下面是在使用单例类中的一种常见,同时需要类方法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

 

 
 
 
 
 
posted @ 2015-10-30 14:05  何杨  阅读(279)  评论(0编辑  收藏  举报