客观c类为什么返回 - (id)而不是它自己的类

时间:2012-11-13 21:21:35

标签: iphone objective-c

我来自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;
}

感谢您的时间

2 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:4)

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

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

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