一次错误的总结(关于: 在实例方法和类方法公用一段代码)
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
相关文章推荐
- springjdbc
- IDEA重复代码提示
- A Case Study of KERAS for Digits Classification
- ACCPJAVAS1no15练习2
- SpringMvc接受日期参数全局处理
- springMVC导入excel文件
- Qt Creator 使用技巧之提高编译速度【使用jom参数】
- 四种线程池的特性以及测试代码
- Spring MVC配置
- ASP.NET MVC中的Global.asax文件
- ASP.NET Core 中文文档 第四章 MVC(3.6.2 )自定义标签辅助类(Tag Helpers)
- tp中 <include file="Public:header"/>
- javaIO一些知识
- HashMap简介
- google测试之道读书笔记一
- Eclipse导入项目: No projects are found to import
- Python 学习笔记
- 【Java】冒泡排序
- Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
- 在MAC平台下使用Eclipse出现了中文乱码