Iphone 目标c类为什么返回-(id)而不是它';我们自己的班级

Iphone 目标c类为什么返回-(id)而不是它';我们自己的班级,iphone,objective-c,Iphone,Objective C,我来自一个C#背景,初始化一个类,然后像这样返回它自己 public class MyClass{ public int Id; public string Name; } MyClass classInstance = new MyClass(); : : 我知道c#与objective c不同,但我正试图找到一种方法来轻松理解objective c是如何工作的,从而使转换更容易。并找出最佳实践 无论如何,我的问题是,为什么必须创建一个方法并返回一个“id”,而不是返回它自己的类型

我来自一个C#背景,初始化一个类,然后像这样返回它自己

public class MyClass{
  public int Id;
  public string Name;
}

MyClass classInstance = new MyClass();
:
:
我知道c#与objective c不同,但我正试图找到一种方法来轻松理解objective c是如何工作的,从而使转换更容易。并找出最佳实践

无论如何,我的问题是,为什么必须创建一个方法并返回一个“id”,而不是返回它自己的类型?像这样:

- (id)initWithID:(NSInteger)id name:(NSString *)name
{
    self = [self init];
    if (self) {
        self.ID = id;
        self.name = name;
    }
    return self;
}

感谢您抽出时间

由于继承,您在初始化方法中返回了类型为
id
的对象


这样想:您有一个类为
Foo
的对象。它有一个名为
initWithWidgets
的init方法。现在,您创建了一个子类
Foo
,并将其命名为
Bar
。根据继承规则,它可以访问
initWithWidgets
方法。如果
initWithWidgets
的返回类型是
Foo
,那么您的
Bar
类将无法使用它来初始化自身!返回类型将不同于您尝试实例化的对象。因此,如果您使用
id
,您的意思是“此对象的返回类型可以是任何类型”,并且对于子类来说是安全的

当方法返回类型为
id
的对象时,表示该对象可以是任何类型。例如,如果您声明一个
NSMutableArray
,您可以执行以下操作:

NSMutableArray *someArray = [[NSMutableArray alloc] init];

init
正在返回一个
NSMutableArray
对象。但有时,
init
方法可能返回父类,如本例中的
NSArray
。使用
id
类型可以返回任何对象。

您的问题在这个线程中得到了回答:我确实已经看到了,但对我来说没有意义。我认为发布一个新问题会让我更容易回答另一个问题。如果它浪费了空间,我道歉,但它仍然帮助了我。没问题。也许参考资料可以帮助其他人。我明白了,这是有道理的!作为记录,我确实从另一个链接看到了一个问题的答案,我只是很难理解它。我觉得这更有道理。再次感谢