2011-03-07 105 views

回答

2

在Objective-C,对象分配和初始化是分开运作,但它是常见的,一个很好的做法,看看他们在表达相同的情况下调用:

MyClass *myInstance = [[MyClass alloc] init]; 

// ... 

[myInstance release]; 

在C当您使用new#,分配和初始化发生:

MyClass myInstance = new MyClass(); 

运行时分配的实例和然后调用构造函数。

所以,是的,在C#构造函数是等同于Objective-C的初始化,但用法不同。

除此之外... Objective-C中的init只是一个正常的实例方法,没有任何特殊的语义。你可以在任何时候调用它。在C#中,构造非常特殊的运行时,用特殊的规则区别对待静态样的方法。例如,C#编译器强制调用基类构造函数。

0

它们类似于仅就像你可以比较用于创建对象的两种完全不同的方法。在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

0

他们类似的弱/动态类型语言,但不完全相同。从技术上讲,一个构造完全创建和初始化实例,而一个初始化接受一个已经构建的实例(通常是通过alloc得到),并设置实例,以便它是随时可以使用。

至于Objective-C和C#之间的区别:他们是两个不同的,大多不相关的语言。当你学习一种新的语言时,试图把它看作“像我已经知道的这种语言,但是有了这些差异”实际上可以使它更难以学习,因为它们之间存在差异,而且它们往往是不同的微妙的,所以用其他语言的假设会让你感到困惑。如果你围绕Stack Overflow进行搜索,你会发现许多PHP程序员开始学习一种新的语言,并立即想知道“我该如何用这种语言做变量变量?”这就像寻找中英文差异的清单 - 你最好不要试图对待另一个。记住你已经知道的东西,但是尽量不要假定Objective-C中的任何一个都是一样的。