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:
被运行,这将把您的程序发送到无限循环中。