美文网首页
UIApplication - 02模拟单例

UIApplication - 02模拟单例

作者: js_huh | 来源:发表于2020-08-08 16:02 被阅读0次
    • 模仿UIApplication单例 - 实现过程, 要求如下:
      • 程序一启动就创建好了对象.
      • 只能获取对象,且获取的对象地址都是同一个!
      • 不能够进行alloc操作,当执行alloc时, 程序发生崩溃.

    思路

    • 在哪里创建对象,程序一启动就会创建好呢?
      • 当类被加载到内存的时候,就会调用load方法。
        load 方法main 方法更早调用。
      • load方法中创建的对象,出了load方法,就销毁了。
        那么,怎么保存load方法中创建的对象呢 ?
        • 成员属性来保存,可以吗? ❌ 会报错
          • 语法 : 成员属性,不能在类方法访问
            + load是类方法,所以出现以下提示:

          • 错误提示: Instance variable '_per' accessed in class method
            成员属性,在类方法中被访问!

        • 用静态的变量来保存,load里面创建对象。✔️

    • 只能获取对象,且获取的对象地址都是相同得!
      static Person *_pers;
      + (instancetype)sharedPerson{
      return _pers;
      }
      

    • 不能够进行alloc操作,当执行alloc时, 程序发生崩溃.
      • 对象在load 方法的时候,就创建了。
      • 想让系统的alloc 方法失效,只需要重写下自己的alloc 方法即可。
        • 当对象有值时,直接抛出异常.
        • 没有值时,调用父类的alloc 方法,(原本系统的alloc 方法)
        + (instancetype)alloc{
        if(_pers){ -- 对象有值时
            -- 创建 NSException对象
           NSException *exception= [NSException exceptionWithName:@"NSInternalInconsistencyException" reason:@"There can only be one Person instance" userInfo:nil];
           -- 抛出异常
           [exception raise];
          }
        return [super alloc]; -- 调用系统的alloc方法
        }
        

    相关文章

      网友评论

          本文标题:UIApplication - 02模拟单例

          本文链接:https://www.haomeiwen.com/subject/nfkwrktx.html