我一直在阅读和学习instancetype,在大多数情况下应该如何使用它而不是id现代的目标c.我可以问一下,什么时候才真正使用id而不是instancetype?谢谢.
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方法的东西.
| 归档时间: |
|
| 查看次数: |
244 次 |
| 最近记录: |