何时在objective-c中使用id?

che*_*ead 2 objective-c

我一直在阅读和学习instancetype,在大多数情况下应该如何使用它而不是id现代的目标c.我可以问一下,什么时候才真正使用id而不是instancetype?谢谢.

abh*_*war 8

ID

id是泛型类型变量.我不会在编译时警告我们,但如果有任何问题它会崩溃.

Instancetype

instancetype 在编译时为我们打字检查以警告我们问题.

例如:

Animal.h

@interface Animal : NSObject

+ (id)giveMeAnimalA;
+ (instancetype)giveMeAnimalB;
+ (Animal *)giveMeAnimalC;

@end
Run Code Online (Sandbox Code Playgroud)

Animal.m

@implementation Animal

+ (id)giveMeAnimalA {
    return [[[self class] alloc] init];
}

+ (instancetype)giveMeAnimalB {
    return [[[self class] alloc] init];
}

+ (Animal *)giveMeAnimalC {
    return [[[self class] alloc] init];
}

@end
Run Code Online (Sandbox Code Playgroud)

假设我们使用 [[Animal giveMeAnimalA] count];

编译器会警告我们什么都没有,但是我们会在运行时因异常而崩溃,因为Animal没有count方法.

如果我们使用 [[Animal giveMeAnimalB] count];

编译器会立即警告我们Animal没有count方法,我们可以避免在运行时崩溃.但是,只是让我们的返回类型Animal*更简单吗?

想象一下,我们有一个Dog子类Animal:

@interface Dog : Animal

- (void)makeSound;

@end
Run Code Online (Sandbox Code Playgroud)

现在,如果我们试图打电话

[[Dog giveMeAnimalC] makeSound];
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为我们将返回一个 Animal没有makeSound方法的东西.