2013-07-29 65 views
1

我再次讀一本書,有這樣實現類:不清楚爲什麼初始化方法被調用了一些類

@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 

我覺得奇怪的事情是,無處類外,例如,一些其他類,是調用BNRItemStoreinit方法。不過,還是通過某些手段它被調用,甚至當有人輸入的BNRItemStore類外這樣的代碼:

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

可有人請解釋一下爲什麼?

回答

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

此行負責撥打init。第一次輸入sharedStoresharedStore變量是nil,所以條件檢查失敗並且類的一個實例被初始化。

+0

嗨亞歷山大,這不是我的問題,我知道程序進入if子句,因爲sharedStore是零。問題是,顯然通過調用'[super allocWithZone:nil]''''調用'BNRItemStore'類的'init'上的'init',儘管使用了'super allocWithZone' ......你明白了嗎? – user2054339

+0

啊,對。檢查答案[這裏](http://stackoverflow.com/a/11962942)。 – Alexander

0

-init被調用,因爲+sharedStore稱之爲:

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

[super allocWithZone:nil]跳過當前類的實現allocWithZone的,並調用超類實現。但是,init是一個普通的方法調用,所以它不會跳過超類實現。

雖然引用的行使它看起來像超級是一個對象,你發送的消息,它確實意味着像「自我,但跳過當前類的實現,並使用超類」。它不影響發送到返回對象的消息。

相關問題