gpt4 book ai didi

iphone - 我应该验证 Foundation API 容器内的对象吗?

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

C++ 这样的语言和C#当您创建诸如 std::vector 之类的包含时或C# list您在创建容器时显式声明容器类型:

C++:

std::vector<MyObject>

C#:

List<MyObject> list = new List<MyObject>();

看到上面的代码,我立即知道这些容器只能包含 MyObject 类型的对象。如果我尝试添加一个不属于这种类型的对象,编译器会提示。

由于 Objective-C 是一种动态语言,因此我们没有编译器警告我们这一点的特权(因为这是一件完全有效但有潜在危险的事情):

Objective-C:

NSDictionary *dict = [[NSDictionary alloc]init];
[dict setValue:[[SomeClass alloc]init] forKey:@"someClass"];
[dict setValue:[[NSMutableString alloc]init] forKey:@"mutableString"];
BOOL classIsSomeClass = [[dict objectForKey:@"someClass"] isKindOfClass:[SomeClass class]];

而是像NSDictionary这样的东西或NSArray将存储和接受继承自 NSObject 的任何类型的对象。我发现这本身非常灵活,但我无法真正确定容器中的对象类型,我只能在 runtime 处真正了解。而 c++c#我在 compile time 知道这一点只需查看代码即可。

在 Apple 的 Foundation Framework 中添加、使用和删除容器类的对象( NSArrayNSSetNSDictionary 等)时,我是否应该验证容器的内容? ?或者这在所有情况下都可以吗?验证会严重损害性能吗?:

NSDictionary *dict = [[NSDictionary alloc]init];
[dict objectForKey:@"someKey"]; // return nil?

最佳答案

Objective-C 的动态消息传递更像是 Python 或 Ruby 等动态语言。在这些语言中,标准范例通常称为“鸭子类型”。换句话说,如果一个对象实例像鸭子一样嘎嘎叫(即响应您发送的消息),那么它就是鸭子。在 Objective-C 中,可以通过多种机制在运行时在对象继承层次结构之外添加方法。因此,更常见的是询问实例是否响应特定选择器:

if([obj respondsToSelector:@selector(myMethod)]) {
[obj myMethod];
}

而不是询问obj是否属于某个类的层次结构。

大多数情况下,Objective-C 开发人员不会执行此检查,除非他们从“未知”模块获取对象实例。相反,我们严重依赖编译器警告(Objective-C 编译器会警告向不确定是否可以接收该消息的类型发送消息)和单元测试。在这种情况下,进行单元测试来确认正确的对象正在进入集合,并且您从集合中获得了预期的类型,这可能会大大减轻您的恐惧。

关于iphone - 我应该验证 Foundation API 容器内的对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3424886/

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