C#“构造函数”是否与Obj-C“初始化程序”相同?

时间:2011-03-07 19:03:53

标签: objective-c xamarin.ios

我对Obj-C非常非常新,并且会有很多问题。 (我有“iPhone编程,大书呆子牧场指南”一书,但它没有解决C#和Obj-C之间的差异。有没有人知道一个解决这些差异的文档?)。

无论如何,我的问题在上面......

3 个答案:

答案 0 :(得分:2)

在Objective-C中,对象分配和初始化是单独的操作,但在同一表达式的上下文中调用它们是很常见的,也是一种很好的做法:

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

// ...

[myInstance release];

在C#中,使用new时会发生分配和初始化:

MyClass myInstance = new MyClass();

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

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

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

答案 1 :(得分:0)

它们的相似之处仅在于您可以比较两种完全不同的创建对象的方法。在Objective-C Runtime上查看此信息。

以下是一个非常简单(但希望没有误解)的解释:

<强>目标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#中你不能调用一个继承的构造函数(参见上面链接的底部),但在Obj-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的弱/动态类型语言

答案 2 :(得分:0)

它们相似但不完全相同。从技术上讲,构造函数完全创建并初始化一个实例,而初始化程序采用一个已经构造的实例(通常通过alloc)并设置实例,以便它可以使用。

至于Objective-C和C#之间的区别:它们是两种不同且大多数不相关的语言。当你学习一门新语言时,试着把它想象成“就像我已经知道的这种语言,但有这些差异”实际上会让学习变得更难,因为有很多差异很多而且它们往往很微妙,所以进入另一种语言的假设会让你感到困惑。如果你搜索Stack Overflow,你会发现许多PHP程序员开始学习一门新语言,并立即想知道“我如何用这种语言做变量变量?”这就像寻找英文和中文之间的差异列表 - 你最好不要试图像对方那样对待。请记住您已经知道的内容,但尽量不要在Objective-C中假设它们是相同的。