使用allocWithZone创建单例:

时间:2012-08-15 01:16:11

标签: objective-c singleton alloc

BNRItemStore是一个单身人士,我对为什么必须调用super allocWithZone:而不是普通的super alloc感到困惑。然后覆盖alloc而不是allocWithZone

#import "BNRItemStore.h"

@implementation BNRItemStore

+(BNRItemStore *)sharedStore {
    static BNRItemStore *sharedStore = nil;

    if (!sharedStore)
        sharedStore = [[super allocWithZone: nil] init];

    return sharedStore;
}

+(id)allocWithZone:(NSZone *)zone {
    return [self sharedStore];
}

@end

2 个答案:

答案 0 :(得分:10)

[super alloc]将调用allocWithZone:,您已覆盖该代码以执行其他操作。为了实际获得超类的allocWithZone:(这是你想要的)的实现而不是被覆盖的版本,你必须明确地发送allocWithZone:

super关键字代表与self相同的对象;它只是告诉方法调度机制开始在超类而不是当前类中查找相应的方法。

因此,[super alloc]将进入超类,并在那里获得实现,如下所示:

+ (id) alloc
{
    return [self allocWithZone:NULL];
}

此处,self仍然代表您的自定义类,因此,您的被覆盖的allocWithZone:会被运行,这会将您的程序发送到无限循环。

答案 1 :(得分:3)

来自Apple的documentation

  

此方法存在历史原因;内存区域不再存在   由Objective-C使用。