gpt4 book ai didi

objective-c - 何时在 Objective-C 中使用 id?

转载 作者:行者123 更新时间:2023-12-03 07:07:44 24 4
gpt4 key购买 nike

我刚刚阅读并了解了 instancetype以及在大多数情况下如何使用它来代替 id在现代的 Objective-c 中。我能问一下,那么什么时候实际使用 id 是明智的呢?而不是instancetype ?谢谢。

最佳答案

id

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

实例类型

instancetype 在编译时为我们进行类型检查,以警告我们出现问题。

例如:

动物.h

@interface Animal : NSObject

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

@end

动物.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

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

编译器不会向我们发出任何警告,但我们会在运行时崩溃并出现异常,因为 Animal 没有 count 方法。

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

编译器会立即警告我们 Animal 没有 count 方法,这样我们就可以避免运行时崩溃。但是将我们的返回类型设置为 Animal* 不是更简单吗?

假设我们有一个 AnimalDog 子类:

@interface Dog : Animal

- (void)makeSound;

@end

现在如果我们尝试调用

[[Dog giveMeAnimalC] makeSound];

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

关于objective-c - 何时在 Objective-C 中使用 id?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30324925/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com