您的位置:首页 > 编程语言

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

2016-09-21 09:28 633 查看

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

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


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: