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

最佳答案

[super alloc]将调用到allocWithZone:,您已重写该命令以执行其他操作。为了实际获得超类的allocWithZone:实现(这是您想要的),而不是重写版本,必须显式发送allocWithZone:
super关键字表示与self相同的对象;它只是告诉方法分派机制开始在超类中而不是当前类中查找相应的方法。
因此,[super alloc]将进入超类,并在那里获得实现,它看起来像:

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

在这里,self仍然代表您的自定义类,因此,重写的allocWithZone:被运行,这将把您的程序发送到无限循环中。

08-05 19:13