一次错误的总结(关于:在实例方法和类方法公用一段代码)
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
相关文章推荐
- C++语言出现的bug
- Eclipse导入项目:No projects are found to import
- matlab
- php的session的几种传递方式
- java的内存区域的模型
- 40个Java多线程问题总结
- Laravel中的日志与上传
- 《第一行代码》 随手笔记——第二章 Activity 活动
- J2EE 第二阶段项目之编写代码(六)
- Codeforces 633H. Fibonacci-ish II (Mo's Algorithm(莫队算法) + 线段树 + 离散化)
- GitHub官方介绍(中文翻译)
- 原来Java中的继承和C#中的继承是不一样的
- Java学习--String为什么是不可变的
- leetcode:Palindrome Linked List 【Java】
- 第二次作业 对VC++6.0编译软件的评价
- C语言学习笔记_3基本的标准输入与输出
- [解决]OS X 下 Python 导入 PIL 中的 ImageGrab 错误
- python开发学习-day08(socket高级、socketserver、进程、线程)
- 用maven管理spark应用程序,提交到spark on yarn 集群上运行
- LeetCode : Search Insert Position [java]