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

简介:

下面是在使用单例类中的一种常见,同时需要类方法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
复制代码
相关文章
|
6月前
|
存储 编译器 程序员
【C++】类与对象(一)类的定义 访问限定符 类的实例化 this指针
【C++】类与对象(一)类的定义 访问限定符 类的实例化 this指针
|
6月前
|
数据处理 Python
类的实例方法和静态方法的使用场合区别
类的实例方法和静态方法的使用场合区别
58 0
|
6月前
|
C++
45 C++ - 继承中同名成员的处理方法
45 C++ - 继承中同名成员的处理方法
28 0
|
3小时前
|
存储 C语言 C++
【c++】类和对象 - 类的访问限定符及封装/作用域和实例化
【c++】类和对象 - 类的访问限定符及封装/作用域和实例化
【c++】类和对象 - 类的访问限定符及封装/作用域和实例化
|
9月前
|
安全 编译器 C++
[C++] 类与对象(中)类中六个默认成员函数(1)上
[C++] 类与对象(中)类中六个默认成员函数(1)上
|
8月前
|
存储 安全 编译器
【C++基础】类与对象(上):访问限定符、类作用域、类实例化、类对象模型、this指针
【C++基础】类与对象(上):访问限定符、类作用域、类实例化、类对象模型、this指针
81 0
|
9月前
|
存储 编译器 C++
[C++] 类与对象(中)类中六个默认成员函数(1)下
[C++] 类与对象(中)类中六个默认成员函数(1)下
|
12月前
方法引用符、引用类方法、引用对象的实例方法、引用类的实例方法及引用构造器
方法引用符、引用类方法、引用对象的实例方法、引用类的实例方法及引用构造器
70 0
|
C++
同样一句代码,在类内调用,跟类外调用结果不同?
同样一句代码,在类内调用,跟类外调用结果不同?
62 0
|
设计模式 安全 Java
Python面向对象、继承的基本语法、单继承和多层继承、子类重写父类的同名方法、子类调用父类的同名方法、继承中的 init 、 多继承、私有权限、类属性、类方法、静态方法、多态、鸭子类型
称为类 B 继承类 A 特点: B类的对象可以使用 A类的属性和方法 优点: 代码复用.重复相同的代码不用多次书写. 名词: 类A: 父类 基类 类B: 子类 派生类 2. 单继承和多层继承[理解] 单继承: 如果一个类只有一个父类,把这种继承关系称为单继承 多继承: 如果一个类有多个父类,把这种继承关系称为多继承 多层继承: C–> B --> A 3. 子类重写父类的同名方法[掌握] 重写: 子类定义和父类名字相同的方法. 为什么重写: 父类中的方法,不能满足子类对象的需求,所以
413 1
Python面向对象、继承的基本语法、单继承和多层继承、子类重写父类的同名方法、子类调用父类的同名方法、继承中的 init 、 多继承、私有权限、类属性、类方法、静态方法、多态、鸭子类型