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中的任何一个都是一样的。