7

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

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

MyClass classInstance = new MyClass();
:
:

我知道 c# 与目标 c 不同,但我正试图找到一种方法来轻松理解目标 c 如何工作以使过渡更容易。并找出最佳实践。

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

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

谢谢你的时间

4

2 回答 2

11

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

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

于 2012-11-13T21:29:12.127 回答
4

当一个方法返回一个 type 的对象时id,这意味着该对象可以是任何类型。例如,如果你声明一个NSMutableArray,你这样做:

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

init正在返回一个NSMutableArray对象。但有时,一个init方法可能会返回一个父类,就像NSArray在这个例子中一样。使用该id类型允许返回任何对象。

于 2012-11-13T21:30:06.747 回答