- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我已阅读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 类型,那么您可以使用 __kindof
的 subviews
方法。
就个人而言,我会/不会使用它 - 直到我遇到一个我还没有看到的非常非常好的用例。
关于ios - __kindof 和不在 Objective-C 中使用它的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33798229/
作为开发人员,我一直在查看 iOS 9 的新功能,其中一些功能(例如 StackView)看起来很棒。 当我查看 UIStackView 的头文件时,我看到了这个: @property(nonatom
Xcode 7 added对象声明的 __kindof 装饰器: KindOf. Objects declared as __kindof types express "some kind of X"
我已阅读article关于 iOS 中 Objective-C 的一些新特性。但是,我不知道这两种方式之间的主要区别是什么: @property (strong, nonatomic, nonnull
我知道我可以使用 __kindof 来使用 Objective-C 的轻量级泛型。关键字,例如 NSArray *myArray; 这将删除任何将数组中的任何对象分配给派生类的警告。 但是,而不是 B
我是一名优秀的程序员,十分优秀!