【发布时间】:2010-08-06 14:47:01
【问题描述】:
在C++ 和C# 等语言中,当您创建std::vector 或C# list 等容器时,您在创建容器时显式声明容器类型:
C++:
std::vector<MyObject>
C#:
List<MyObject> list = new List<MyObject>();
查看上面的代码,我立即知道这些容器只能包含 MyObject 类型的对象,如果我尝试添加不属于该类型的对象,编译器会报错。
由于 Objective-C 是一种动态语言,我们没有编译器警告我们这一点的特权(因为这是一个完全有效但有潜在危险的事情):
目标-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 添加、使用和删除容器类(NSArray、NSSet、NSDictionary 等)的对象时,我是否应该验证容器的内容?或者这在所有情况下都可以吗?验证是否会严重影响性能?:
NSDictionary *dict = [[NSDictionary alloc]init];
[dict objectForKey:@"someKey"]; // return nil?
【问题讨论】:
-
明确一点,NSDictionary 不会响应
initWithCapacity:NSMutableDictionary。objectForKey:在发送到有效的 NSDictionary 对象时永远不会崩溃,即使键不存在或字典的键属于不同类型。它只会返回nil -
@Art:你说得对,我应该在发布之前将我的代码放入编译器中。
标签: iphone objective-c cocoa macos core-foundation