2016-02-06 62 views
0

我對編程知道的一切都表示,實例方法可以調用類方法,但類方法不能調用實例方法成功稱爲實例方法的類方法

這個帖子同意... Call instance method from class method

然而,奇蹟般地類方法sharedInstance設法調用實例方法init。我在想什麼?

static iRpDatabase *sharedDatabase; 

@implementation iRpDatabase 
{ 
} 

    +(iRpDatabase*)sharedInstance 
    { 
     if(sharedDatabase == nil) 
     { 
      sharedDatabase = [[self alloc] init]; 
     } 
     return sharedDatabase; 
    } 

    // this is an instance method, called from class method above. 
    -(id)init 
    { 
     if (self = [super init]) { 
      someInstanceVariable = XYZ; 
      [self someInstanceMethod]; 
     } 
     return self; 
    } 

回答

1

,一個類方法不能調用實例方法意味着該類方法不能調用上self實例方法因爲self表示類,而不是類的一個實例的說明。

sharedInstance方法中,您正在調用一個實例方法,但正在該類的特定實例上調用它。沒關係。

覺得這個例子:

+ (void)someClassMethodOfiRpDatabase { 
    NSString *str = @"Hello"; 
    NSInteger len = [str length]; // look - I called an instance method 
} 

這個例子中沒有比你sharedInstance方法的問題不同。在對象的特定實例上調用實例方法是很好的,即使您恰好處於某種類的方法中。

+0

如果你看看你的例子(我們可以在NSObject的任何子類上看到),你會發現你並沒有在self上調用init,而是根據[self alloc]的結果 - 這是一個實例。最佳 – Jef

+0

@Jef你應該發表你的評論問題,而不是這個答案。 – rmaddy