我對Obj-C非常非常陌生,並且會有很多問題。 (我有這本書「iPhone Programming,The Big Nerd Ranch Guide」,但它沒有解決C#和Obj-C之間的區別。有沒有人知道一個文檔能夠解決這些差異?)。C#「構造函數」與Obj-C「初始化函數」相同嗎?
不管怎樣,我的問題是,上面...
我對Obj-C非常非常陌生,並且會有很多問題。 (我有這本書「iPhone Programming,The Big Nerd Ranch Guide」,但它沒有解決C#和Obj-C之間的區別。有沒有人知道一個文檔能夠解決這些差異?)。C#「構造函數」與Obj-C「初始化函數」相同嗎?
不管怎樣,我的問題是,上面...
在Objective-C,對象分配和初始化是分開運作,但它是常見的,一個很好的做法,看看他們在表達相同的情況下調用:
MyClass *myInstance = [[MyClass alloc] init];
// ...
[myInstance release];
在C當您使用new
#,分配和初始化發生:
MyClass myInstance = new MyClass();
運行時分配的實例和然後調用構造函數。
所以,是的,在C#構造函數是等同於Objective-C的初始化,但用法不同。
除此之外... Objective-C中的init
只是一個正常的實例方法,沒有任何特殊的語義。你可以在任何時候調用它。在C#中,構造非常特殊的運行時,用特殊的規則區別對待靜態樣的方法。例如,C#編譯器強制調用基類構造函數。
它們類似於僅就像你可以比較用於創建對象的兩種完全不同的方法。在Objective-C Runtime上籤出此信息。
下面是一個非常簡單的(但希望不要誤導)解釋:
Objective-C的
id object = [MyObject alloc]; // allocates the memory and returns a pointer. Factory-like method from NSObject (unless your class overrides it)
MyObject *myObj = [object init]; // initializes the object by calling `-(id)init`. You'll want to override this, or a similar init method for all your classes.
通常這樣寫的:
MyObject *myObj = [[MyObject alloc] init];
據我所知,C# constructor分配內存並調用相應的構造函數來初始化該對象。
的區別是,在C#中,你無法調用繼承的構造(見上面的鏈接的底部),但對象 - 這將編譯,但會給你錯誤的結果。
@interface ClassA : NSObject
- (id) initWithInteger:(int)num;
@end
@interface ClassB : ClassA
- (id) init;
@end
@implementation ClassB
- (id) init
{
self = [supere initWithInteger:10];
return self;
}
// main
ClassA *a = [[ClassA alloc] initWithInteger:10]; //valid
ClassB *a = [[ClassB alloc] initWithInteger:10]; // will call init from classA, bypassing and not calling init for classB.
只要小心使用Objective-C
他們類似的弱/動態類型語言,但不完全相同。從技術上講,一個構造完全創建和初始化實例,而一個初始化接受一個已經構建的實例(通常是通過alloc
得到),並設置實例,以便它是隨時可以使用。
至於Objective-C和C#之間的區別:他們是兩個不同的,大多不相關的語言。當你學習一種新的語言時,試圖把它看作「像我已經知道的這種語言,但是有了這些差異」實際上可以使它更難以學習,因爲它們之間存在差異,而且它們往往是不同的微妙的,所以用其他語言的假設會讓你感到困惑。如果你圍繞Stack Overflow進行搜索,你會發現許多PHP程序員開始學習一種新的語言,並立即想知道「我該如何用這種語言做變量變量?」這就像尋找中英文差異的清單 - 你最好不要試圖對待另一個。記住你已經知道的東西,但是儘量不要假定Objective-C中的任何一個都是一樣的。