一次错误的总结(关于:在实例方法和类方法公用一段代码)
下面是在使用单例类中的一种常见,同时需要类方法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