执行文件如下:
@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.'
看了你上面的代码,可以看出,你对“对象”的创建的过程一点也不了解。
对象也可以称之为类的实例,可以把类比喻成“模子”,而对象就是通过这个“模子”制造出来的具体产品。而对象的创建过程就是:
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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。