我正在读一本书,并且有类的实现:
@implementation BNRItemStore
// Init method
- (id)init
{
self = [super init];
if(self)
{
allItems = [[NSMutableArray alloc] init];
}
return self;
}
#pragma mark singleton stuff
// Implementing singleton functionality
+(BNRItemStore*) sharedStore
{
static BNRItemStore *sharedStore = nil;
// Check if instance of this class has already been created via sharedStore
if(!sharedStore)
{
// No, create one
sharedStore = [[super allocWithZone:nil] init];
}
return sharedStore;
}
// This method gets called by alloc
+ (id)allocWithZone:(NSZone *)zone
{
return [self sharedStore];
}
#pragma mark Methods
// return pointer to allItems
-(NSArray*) allItems
{
return allItems;
}
// Create a random item and add it to the array. Also return it.
-(BNRItem*) createItem
{
BNRItem *p = [BNRItem randomItem];
[allItems addObject:p];
return p;
}
@end
我觉得很奇怪的是,课外的无处,例如,其他一些类,是init
调用的BNRItemStore
方法。但是,即使有人在BNRItemStore
类之外键入了这样的代码,它仍会通过某种方式被调用:
[[BNRItemStore sharedStore] createItem]; // This still calls the init method of BNRItemStore. How?
有人可以解释一下原因吗?
答案 0 :(得分:1)
sharedStore = [[super allocWithZone:nil] init];
这一行负责init
电话。首次输入sharedStore
sharedStore
变量为nil
,因此条件检查失败,并初始化类的实例。
答案 1 :(得分:0)
-init
被调用,因为+sharedStore
称之为:
sharedStore = [[super allocWithZone:nil] init];
[super allocWithZone:nil]
跳过当前类的allocWithZone实现并调用超类实现。但是,init是一个普通的方法调用,因此它不会跳过超类实现。
尽管引用的行使得它看起来像是一个正在向其发送消息的对象,但它实际上意味着类似“self,但跳过当前类的实现并改为使用超类”。它不会影响发送到返回对象的消息。