我是Objective-C的新手,我不知道为什么这段代码不起作用:
NSMutableDictionary *bookmarks = [NSMutableDictionary dictionaryWithCapacity:(NSUInteger) 4]; [bookmarks setObject:@"Stanford University" forKey:[NSURL URLWithString:(NSString *) @"http://www.stanford.edu"]]; [bookmarks setObject:@"Apple" forKey:[NSURL URLWithString:(NSString *) @"http://www.apple.com"]]; [bookmarks setObject:@"Berkeley" forKey:[NSURL URLWithString:(NSString *) @"http://www.berkeley.edu"]]; [bookmarks setObject:@"CS193P" forKey:[NSURL URLWithString:(NSString *) @"http://cs193p.stanford.edu"]]; NSEnumerator *browser = [bookmarks keyEnumerator]; id each; NSURL *url; while ((each = [browser nextObject])) { url = [browser valueForKey:(NSString *)each]; NSLog(@"%@", [url absoluteURL]); }
我得到的错误是:
2009-06-29 11:25:22.844 WhatATool[2102:10b] *** -[NSURL length]: unrecognized selector sent to instance 0x1072c0 2009-06-29 11:25:22.845 WhatATool[2102:10b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSURL length]: unrecognized selector sent to instance 0x1072c0'
任何帮助,将不胜感激.谢谢.
一个关键是你用来访问什么对象字典中.您-[bookmarks setObject:... forKey...]
在代码中调用的每一行上都可以反转键和对象.您的案例中出现的问题是因为您尝试将NSURL对象视为NSString对象 - [bookmarks objectForKey:(NSString *)each]
并且字典试图通过调用获取所谓字符串的长度,该字符串-length
存在于NSString但不存在于NSURL中.
如果您总是使用相同的对象构建字典,请考虑使用更紧凑的"varargs"构造函数NSDictionary
.(请注意,最后一个以逗号分隔的参数必须为nil - 请参阅相关文档.)您还可以使用-[NSDictionary dictionaryWithObjects:forKeys:]
两个NSArray对象,其中包含URL和书签名称.(顺便说一下,NSString*
为了创建NSURL而输入字符串文字是完全没必要的.)
NSDictionary *bookmarks = [NSDictionary dictionaryWithObjectsAndKeys: [NSURL URLWithString:@"http://www.stanford.edu"], @"Stanford University", [NSURL URLWithString:@"http://www.apple.com"], @"Apple", [NSURL URLWithString:@"http://www.berkeley.edu"], @"Berkeley", [NSURL URLWithString:@"http://cs193p.stanford.edu"], @"CS193P", nil];
此外,你还有一个尚未提及的潜伏错误:browser
是一个NSEnumerator
,但你的呼唤valueForKey:
就好像它是一个NSDictionary
而不是一个bookmarks
.这也会导致无法识别的选择器发生类似的崩溃.(即使对于字典对象,你也应该调用-objectForKey:
; -valueForKey:
主要用于/由Cocoa绑定,并且做你不需要的额外工作.我意识到它是令人困惑的,因为我们考虑"键值对",但它有它是...)
最后,您还可以稍微简化枚举代码.(NSDictionary
枚举它的键的for-in循环就像-keyEnumerator
那样.)
以下是我建议做最后一部分的方法:
NSURL *url for (NSString *key in bookmarks) { url = [bookmarks objectForKey:key]; NSLog(@"%@", [url absoluteURL]); }