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

时间:2013-07-29 10:37:39

标签: ios objective-c

我正在读一本书,并且有类的实现:

@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?

有人可以解释一下原因吗?

2 个答案:

答案 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,但跳过当前类的实现并改为使用超类”。它不会影响发送到返回对象的消息。