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
allocWithZone:
的原因是限制该类的任何用户创建另一个实例。他们将调用alloc
(或可能直接调用allocWithZone:
);而不是分配新实例,您将返回现有实例。这是使类成为单例的关键部分。 - jscs[super alloc]
会返回我们自定义类的一个实例呢?难道不是因为super
这个关键字调用了父类的alloc
方法吗?我弄不明白为什么[super alloc]
会返回我们自定义类的实例,而不是NSObject
的一个实例 - 也就是super类的实例。(在OP的代码中,接口声明是@interface BNRItemStore : NSObject
,我也在读同一本书 :) - Fred Collinssuper
会去查找超类中方法的实现代码。调用方法的对象身份与self
相同。因此,超类的alloc
实现会执行类似于“获取大小为self
类的零内存块”的操作,而不是“获取在此方法中实现的类的内存块”。如果是后者,每个子类都必须提供自己的alloc
。 - jscs