我的一个朋友在使用NSDictionary时发现了一些奇怪的行为,我很好奇它是如何发生的。请看下面的代码:
NSDictionary *dict = [[NSDictionary alloc] init];
// Oops, we can't mutate an NSDictionary
[dict setObject:[[NSNull alloc] init] forKey:@"test"];
NSLog(@"Set");
该代码在编译时会产生警告,提示“'NSDictionary'可能无法响应'setObject:forKey:'”。这很好理解,如果您仍然运行它,您将在控制台中获得以下输出:
- [__NSCFDictionary setObject:forKey:]:发送到不可变对象的改变方法
同样,这正是您期望发生的事情。但是,在此时应用程序不会崩溃或由于未捕获的异常而终止。setObject:forKey:方法根本没有返回,应用程序似乎停顿了;以下的
NSLog
从未执行。如果您尝试使用GDB跨越或进入该方法,调试似乎就会结束,但没有任何明确的错误消息。应用程序继续运行,但调试器并没有提供有关执行被“卡住”的代码位置的线索。这里发生了什么?在这种情况下,应用程序实际上在做什么,为什么不会崩溃出现NSInternalInconsistencyException或类似的东西? 编辑:对于那些问过的人,我在运行OS X Lion(10.7.2)上的XCode 4.1,使用“Apple LLVM编译器2.1”构建。我使用XCode 4中新的Cocoa项目默认设置。无论是调试程序还是仅“运行”它,我都遇到了相同的非崩溃行为。从Debug构建更改为Release构建没有任何区别。我甚至可以手动在Finder中找到.app文件并双击它以在XCode之外执行它,它仍然不会崩溃。