繰り返しますが、私は本を読んでいますが、そのようなクラスの実装があります:
@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?
誰かが理由を説明してもらえますか?