访问NSDictionary问题

时间:2011-07-17 19:35:23

标签: iphone objective-c nsdictionary

我只是iPhone开发的新手,所以如果这是一个愚蠢的问题我很抱歉。我正在根据我正在阅读的书籍构建各种应用程序,他们的一个建议是构建一个迷你Web浏览器。我认为这很容易,但大多数情况下,我正在认真地对待NSDictionary

我有UISegmentedControl用于显示各种书签。 UISegmentedControl按钮上显示的书签名称将成为我的密钥,url是与之关联的值。

我首先尝试将NSDictonary声明为私有(全局变量),但由于我无法使其工作,因此我在我的头文件中声明它如下:

@property (nonatomic, retain) NSDictionary *bookmarks;

我合成它并在viewDidLoad中初始化它,如下所示:

- (void)viewDidLoad
{
    bookmarks = [NSDictionary
                 dictionaryWithObjectsAndKeys:@"http://www.microsoft.com",
                                              @"Microsoft",
                                              @"http://www.google.com",
                                              @"Google",
                                              @"http://www.apple.com",
                                              @"Apple",
                                              @"http://msdn.microsoft.com",
                                              @"MSDN", nil];
    [super viewDidLoad];
}

然后我将控件与我的分段控件相关联,当触发事件并调用该函数时,我得到了以下代码:

- (IBAction) getShortcut:(id)sender
{
  NSString *shortcut;
  shortcut = [shortcuts titleForSegmentAtIndex:shortcuts.selectedSegmentIndex];
  NSString *url = [bookmarks valueForKey:shortcut];
  //[self navigateTo: url];
  [url release];
}

当点击UISegmentedControl中的按钮时,我提取值并将其存储到快捷方式中,然后我尝试使用快捷方式变量作为​​键从NSDictionary中提取相关值书签“但不断崩溃 NSString *url = [bookmarks valueForKey:shortcut]; 并弹出我的功能并显示常见错误EXC_BAD_ACCESS

非常感谢任何帮助。

吨。

4 个答案:

答案 0 :(得分:2)

该词典是自动释放的。

试试这个:

self.bookmarks = [NSDictionary dictionaryWithObjectsAndKeys...]

答案 1 :(得分:2)

您有两种选择。一个是直接处理 ivar ,就像@Matt S.发布的那样。请注意,在这种情况下,您需要为对象保留足够的保留计数。您正在使用并自动释放对象并导致错误。

另一种选择是使用您已定义的属性:

self.bookmarks = [[NSDictionary ...]];

该物业保留了它。

答案 2 :(得分:1)

您没有保留NSDictionary

执行:

bookmarks = [[NSDictionary
                 dictionaryWithObjectsAndKeys:@"http://www.microsoft.com",
                                              @"Microsoft", nil] retain];

答案 3 :(得分:1)

问题是,您没有在viewDidLoad方法中保留“书签”。在Apple文档中有一个提到的命名约定:如果初始化方法以“init ...”开头,则保留返回的对象,如果不是,则必须自己执行。 “dictionaryWithObjectsAndKeys”返回并且对象具有保留计数0,这意味着,在赋值范围(您的viewDidLoad方法)之后,它立即被释放。

所以只需输入一个

[bookmarks retain];
在你的初始化之后你已经完成了。为您保留的另一种解决方案

bookmarks = [[NSDictionary alloc] initWithObjectsAndKeys ...];

你不应该在你的行动中释放网址。一旦你发布字典

,它就会被释放