gpt4 book ai didi

ios - 为什么使用实例类型?

转载 作者:技术小花猫 更新时间:2023-10-29 10:20:19 24 4
gpt4 key购买 nike

有人可以向我解释一下(简单来说)为什么在 Objective-C 中使用 instancetype 吗?

- (instancetype) init { 
self = [super init];
if (self) {
// Custom initialization
}
return self;
}

最佳答案

这是为了提高类型安全性。

在过去,初始化程序只是返回一个类型为 id 的对象(任何对象)。

对于普通的初始化程序(以“init”、“alloc”或“new”开头的初始化程序),这通常不是问题。编译器会自动推断它返回的类型,因此将对对象的任何方法调用限制为该类的实例方法。

但是,这静态便利初始化器或“工厂方法”的问题,它们不一定遵循相同的命名约定 - 因此它无法应用相同的类型安全。

这意味着像这样的类:

@interface Foo : NSObject

+(id) aConvenienceInit;

@end

编译器会接受这样的代码:

NSArray* subviews = [Foo aConvenienceInit].subviews;

为什么?因为返回的对象可以是任何对象,所以如果您尝试访问 UIView 属性 - 没有类型安全可以阻止您。

但是,现在有了 instancetype,您得到的结果就是给定实例的类型。现在使用此代码:

@interface Foo : NSObject

+(instancetype) aConvenienceInit;

@end

...

NSArray* subviews = [Foo aConvenienceInit].subviews;

您将收到一个编译器警告,指出属性 subviews 不是 Foo* 的成员:

尽管值得注意的是,如果您的方法以“alloc”、“init”或“new”开头,编译器会自动将返回类型从 id 转换为 instancetype - 但尽可能使用 instancetype 是一个养成的好习惯。


请参阅 Apple docsinstancetype 上获取更多信息。

关于ios - 为什么使用实例类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36020540/

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