gpt4 book ai didi

ios - 不清楚为什么在某些类上调用 init 方法

转载 作者:行者123 更新时间:2023-11-29 13:08:39 25 4
gpt4 key购买 nike

我又在看书了,类的实现是这样的:

@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

我觉得奇怪的是,类之外的 Nowhere 调用了 BNRItemStoreinit 方法,例如,其他类。然而,它仍然通过某种方式被调用,即使有人在 BNRItemStore 类之外输入了这样的代码:

    [[BNRItemStore sharedStore] createItem]; // This still calls the init method of BNRItemStore. How?

谁能解释一下为什么?

最佳答案

sharedStore = [[super allocWithZone:nil] init];

这一行负责调用init。第一次进入sharedStore时,sharedStore变量为nil,所以条件检查失败,类的一个实例被初始化。

关于ios - 不清楚为什么在某些类上调用 init 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17921862/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com