zoukankan      html  css  js  c++  java
  • 一次错误的总结(关于:在实例方法和类方法公用一段代码)

    下面是在使用单例类中的一种常见,同时需要类方法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
     
     
     
     
     
  • 相关阅读:
    cf Round #764(Div. 3)
    查看w3wp.exe 进程
    CAML语法 Query写法
    InfoPaht 复选框
    性能工具MiniProfiler在Asp.Net WebForm跟踪EntityFramework
    CAML基础语法
    Moss 本机无法访问(转)
    STSADM 不是内部或外部命令
    spBodyOnLoadFunctionNames
    关于代码调用SSP获取UserProfile出错的解决方案(转)
  • 原文地址:https://www.cnblogs.com/goodboy-heyang/p/4923139.html
Copyright © 2011-2022 走看看