2010-08-18 44 views
0

我剛剛開始在Objective-C中編程,我知道它只是部分支持方法重載,因爲方法名稱的生成方式(請參閱this question)。Objective-C中的方法重載 - 不用於init?

但是,我的問題是爲什麼我從來沒有見過它在任何例子中使用。下面的代碼似乎工作正常,但我看到的任何類型的示例,第二個init將被命名爲initWithServerName或類似的東西,而不是利用重載。

-(id) init { 
    self = [super init]; 
    return self; 
} 

// usually this would be called initWithName or something? but to me it 
// seems easier this way because it reminds me of method overloading from C#. 
-(id) init: (NSString*)newServerName { 
    self = [super init]; 
    if(self) {  
     serverName = [[NSString alloc] initWithString:newServerName]; 
    } 
    return self; 
} 

這是什麼原因?這是否會導致子類以這種方式命名方法的問題?

回答

8

與Algol風格的語言(如C#)不同,Objective-C的語法是專門爲識字方法名稱設計的。 init:沒有告訴我方法參數。接收器是否啓動了我傳遞的東西?不。它以某種方式使用參數,因此我們使用描述性名稱(如initWithFormat:)來指定參數是格式字符串。

此外,Objective-C根本沒有方法重載。期。給定類的單個選擇器只能有一個類型簽名。根據參數的類來改變行爲的唯一方法是讓一個方法採用一個泛型,可以包含許多不同的類(如idNSObject*),詢問其類的參數並根據該查詢的結果做不同的事情。

+3

+1「Objective-C根本沒有方法重載。期間」。 – JeremyP 2010-08-18 08:25:06

3

這是不一樣的方法。在Objective-C中,名爲init的選擇器與名爲init:的選擇器不同。冒號是選擇器名稱的一部分。

此外,init經常被覆蓋,你只是有錯誤的方法。

1

除了jer的回答,它也不允許您指定多種方式來初始化實例。例如,NSString具有initWithString:,initWithFormat:等。