gpt4 book ai didi

ios - __kindof 和不在 Objective-C 中使用它的区别

转载 作者:可可西里 更新时间:2023-11-01 03:05:21 25 4
gpt4 key购买 nike

我已阅读article关于 iOS 中 Objective-C 的一些新特性。但是,我不知道这两种方式之间的主要区别是什么:

@property (strong, nonatomic, nonnull) NSArray<UIView *> *someViews;

@property (strong, nonatomic, nonnull) NSArray<__kindof UIView *> *someViews;

对我来说,它们看起来非常相似。有什么区别,什么时候应该使用一个而不是另一个?

最佳答案

要查看 __kindof 的全部效果,我建议直接使用它并查看不同的结果:

NSMutableArray<UIView *> *views;
NSMutableArray<__kindof UIView *> *subviews;

views = [NSMutableArray new];
subviews = [NSMutableArray new];

UIView *someView = [UIView new];

[views addObject:someView];
[subviews addObject:someView];

UIButton *someSubview = [UIButton new];

[views addObject:someSubview];
[subviews addObject:someSubview];

到目前为止,插入到不同的泛型数组中。编译和运行都很好。没有警告,没有崩溃。

然而,有趣的部分是从数组中读取 - 请记住,在两个数组的第一个槽中是一个实际的 UIView *,在第二个槽中是一个 UIButton *

UIView *extView00 = views[0];
UIView *extView01 = subviews[0];
UIView *extView10 = views[1];
UIView *extView11 = subviews[1];

UIButton *extButton00 = views[0]; <-- warning
UIButton *extButton01 = subviews[0];
UIButton *extButton10 = views[1]; <-- warning
UIButton *extButton11 = subviews[1];

这将运行良好,但会为标记的行提供两个编译器警告:

Incompatible pointer types initializing 'UIButton *' with an expression of type 'UIView *'

其他两条线按预期工作。当然仍然没有崩溃。但是我们遇到了一些有问题的情况:extButton01 包含一个 UIView * 但看起来像一个 UIButton *

因此添加以下内容

NSLog(@"%@", extButton00.titleLabel);
NSLog(@"%@", extButton01.titleLabel);
NSLog(@"%@", extButton10.titleLabel);
NSLog(@"%@", extButton11.titleLabel);

如预期的那样在第一行和第二行崩溃。如果我们删除整个 views 数组,我们将得到无警告但崩溃的代码。而且我不喜欢崩溃但没有警告的代码。当然,无警告并不能保证不会崩溃,但是恕我直言,为了方便而删除警告并不是一个好主意。

结论

是的,该功能非常适合移除类型转换。 但是 它还删除了类型不匹配的可能有用的警告。如果您 100% 确定索引 X 处的对象是 T 类型,那么您可以使用 __kindofsubviews 方法。

就个人而言,我会/不会使用它 - 直到我遇到一个我还没有看到的非常非常好的用例。

关于ios - __kindof 和不在 Objective-C 中使用它的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33798229/

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