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

下面是在使用单例类中的一种常见,同时需要类方法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

时间: 2024-08-03 18:58:58

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

ava基础 代码错误-Java新手,求大神帮小弟看看这段代码哪里错了,多谢!!!

问题描述 Java新手,求大神帮小弟看看这段代码哪里错了,多谢!!! class Student { //姓名 private String name; //年龄 private int age; //构造方法 public Student(){ } public Student(String name, int age){ this.name = name; this.age = age; } public String getName(){ return name; } public voi

管理O365网站集的代码,winform的一段代码遇到了错误

问题描述 希望能实现的功能有1:获取https://XXXXX-admin.sharepoint.com的网站集下面的所有网站2:可以选择一些网站安装/卸载/配置APP.目前在获取所有网站集及网站的时候报错:Anunhandledexceptionoftype'System.Xml.XmlException'occurredinSystem.Xml.dllAdditionalinformation:'='isanunexpectedtoken.Theexpectedtokenis';'.Line

math.h-为何这段代码在DEV中运行结果错误

问题描述 为何这段代码在DEV中运行结果错误 #include<stdio.h> #include<math.h> int main() { int i; for(i=100;i<1000;i++) if(i==pow(i%10,3)+pow(i/100,3)+pow(i/10%10,3))printf("%dn",i); return 0; } 求所有3位数水仙花数 我提交到蓝桥杯练习平台结果却是正确的 解决方案 printf("%dn&quo

c语言-麻烦大家帮我看一下这段代码有啥错误?

问题描述 麻烦大家帮我看一下这段代码有啥错误? #include<stdio.h> int b[100],c[100],x; void input(int a[],int n) {printf("输入数组a<10个元素>:"); for(int i=0;i<n;i++) scanf("%c",&a[i]);} void insert(int a[],int n,int x) {for(int i=0;i<n;i++) if

javascript-大神们,帮忙看看这段代码有什么错误,为什么改为10点可以,9点就不行了?

问题描述 大神们,帮忙看看这段代码有什么错误,为什么改为10点可以,9点就不行了? <?php date_default_timezone_set("Asia/Shanghai"); //配置每天的活动时间段 $nowtime = time(); $starttimestr = date('H:i:s',time()); $ntime= date('H:i:s',time()); if ($ntime<"9:00:00") {$endtimestr =

编程语言-这段代码有什么错误,为什么输入后就不能运行了??

问题描述 这段代码有什么错误,为什么输入后就不能运行了?? #include #define MAX 100 //顺序栈的定义 typedef struct{ int *base; int *top; int stacksize; }SqStack; //初始化 int InitStack(SqStack &S){ S.base=new int[MAX]; if(!S.base){ return 0; } S.base=S.top; S.stacksize=MAX; return 1; } //

汇编-下面一段代码的错误不明白,子程序的保护现场和恢复现场要怎么写?在哪写?

问题描述 下面一段代码的错误不明白,子程序的保护现场和恢复现场要怎么写?在哪写? DATAS SEGMENT letter db 0 digit db 0 other db 0 str db 80,?,80 dup(?) str2 db 'letter:$' str3 db 'digit:$' str4 db 'other:$' DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV

ios-【iOS问题】实例方法和类方法的区别?还有使用中有的优缺点?哪个使用频率高?

问题描述 [iOS问题]实例方法和类方法的区别?还有使用中有的优缺点?哪个使用频率高? [iOS问题]实例方法和类方法的区别?还有使用中有的优缺点?哪个使用频率高? 解决方案 实例方法和类方法的区别: 实例方法需要创建对象后,由该对象调用,也就是只能被对象使用的方法 类方法,也就是类自身可以调用的方法 优缺点以及使用频率这个不太好说 一般使用类方法的地方都是为了调用简单,并且内存占用少,因为它不需要new或者alloc init 解决方案二: 两个都差不多, 一般都是两种都写,给别人多点选择,

这段代码为什么输出不了结果?实在是找不到错误

问题描述 这段代码为什么输出不了结果?实在是找不到错误 package com.xiaoyuanling; import java.util.ArrayList;import java.util.HashSet;import java.util.Scanner;import java.util.Set; public class Method { public Passenger[] passenger={new Passenger(""1 ""奥迪A4 "