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
    复制代码
  • 相关阅读:
    (zt)在PHP中使用全局变量
    (zt)Flash与C++交互
    (zt)关于Flash Socket通信的安全策略问题的一点心得
    (zt)svn 随服务器启动
    使用InstallShield安装和卸载SQL Server数据库(利用sql脚本)
    异常查看部分代码
    VC为控件添加背景
    深入分析MFC文档视图结构
    VC数据库编程概述
    (转)WEB程序打包详解:(连接SQL2005数据库,修改配置文件,建立虚拟目录)
  • 原文地址:https://www.cnblogs.com/LiLihongqiang/p/5891449.html
Copyright © 2011-2022 走看看