当前位置:  开发笔记 > IOS > 正文

Objective-C NSDictionary和NSURL的问题

如何解决《Objective-CNSDictionary和NSURL的问题》经验,为你挑选了1个好方法。

我是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'

任何帮助,将不胜感激.谢谢.



1> Quinn Taylor..:

一个关键是你用来访问什么对象字典中.您-[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]);
}

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有