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

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

2016-03-11 00:00 441 查看
下面是在使用单例类中的一种常见,同时需要类方法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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: