开发者社区> 问答> 正文

关于无法初始化类对象-XCode 的问题

执行文件如下:

   @implementation Utils    
   +(id)alloc
   {
         return [self instance];
   }
   +(Utils *)instance
   {
        static Utils *utils = nil;
        if (!utils) {
           utils = [self init];
        }
        return utils;
   }
  -(Utils *)init
  {
       self = [super init];
       if (self) {
           mConst = [Constants instance];
           mCONT_REGEXP = [mConst CONT_REGEXP];
       }
       return self;
   }

在调用[Utils instance];时报错:

 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** +[Utils<0xbff54> init]: cannot init a class object.'

展开
收起
爵霸 2016-03-17 11:42:16 1949 0
1 条回答
写回答
取消 提交回答
  • 看了你上面的代码,可以看出,你对“对象”的创建的过程一点也不了解。
    对象也可以称之为类的实例,可以把类比喻成“模子”,而对象就是通过这个“模子”制造出来的具体产品。而对象的创建过程就是:
    1、由alloc静态方法创建对象时,cocoa会从应用程序的虚拟地址空间上为该对象分配足够的内存。cocoa会遍历该对象所有的成员变量,通过成员变量的类型来计算所需占用的内存
    cocoa除了上面提到的申请了一块足够大的内存外,还做了以下3件事:

    . 将该新对象的引用计数(Retain Count)设置成1。
    . 将该新对象的isa成员变量指向它的类对象。
    . 将该新对象的所有其它成员变量的值设置成零。(根据成员变量类型,零有可能是指nil或Nil或0.0)

    2、 init方法
    大部分情况下,我们都不希望所有成员变量都是零,所以init方法会做真正的初使化工作,让对象的成员变量的值符合我们程序逻辑中的初始化状态。

    所以一般的alloc方法是不允许用户自己去重写,你所可以自己实现的方法是init方法。一个单例类的简单实现应该是这样:

    @implementation Utils    
     static Utils *_instance = nil;
       +(Utils *)instance
       {
            if (_instance==nil) {
               _instance = [[self alloc] init];
            }
            return _instance;
       }
    
      -(id)init
      {
           self = [super init];
           if (self) {
               mConst = [Constants instance];
               mCONT_REGEXP = [mConst CONT_REGEXP];
           }
           return self;
       }
    
    @end
    2019-07-17 19:05:00
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载