Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 访问词典问题_Iphone_Objective C_Nsdictionary - Fatal编程技术网

Iphone 访问词典问题

Iphone 访问词典问题,iphone,objective-c,nsdictionary,Iphone,Objective C,Nsdictionary,我是iPhone开发的新手,如果这是一个愚蠢的问题,我深表歉意。我正在根据我正在读的一本书构建各种应用程序,他们的建议之一是构建一个迷你网络浏览器。我原以为这很容易,但尽管大部分都很容易,但我正在认真地与NSDictionary作斗争 我有一个UISegmentedControl用于显示各种书签。UISegmentedControl按钮上显示的书签名称将是我的键,url是与之关联的值 我首先尝试将一个nsdictional声明为私有(全局变量),但由于无法使其工作,我在头文件中声明它,如下所示:

我是iPhone开发的新手,如果这是一个愚蠢的问题,我深表歉意。我正在根据我正在读的一本书构建各种应用程序,他们的建议之一是构建一个迷你网络浏览器。我原以为这很容易,但尽管大部分都很容易,但我正在认真地与
NSDictionary
作斗争

我有一个
UISegmentedControl
用于显示各种书签。
UISegmentedControl
按钮上显示的书签名称将是我的键,url是与之关联的值

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

@property (nonatomic, retain) NSDictionary *bookmarks;
- (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];
}
我合成了它,并在viewDidLoad中初始化了它,如下所示:

@property (nonatomic, retain) NSDictionary *bookmarks;
- (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
“bookmarks”中提取关联值,但它不断崩溃
NSString*url=[bookmarks valueForKey:shortcut]
并弹出我的功能并显示通常的错误EXC_BAD_ACCESS

任何帮助都将不胜感激


那本词典是自动出版的

试试这个:

self.bookmarks = [NSDictionary dictionaryWithObjectsAndKeys...]

那本词典已自动出版

试试这个:

self.bookmarks = [NSDictionary dictionaryWithObjectsAndKeys...]

您没有保留
NSDictionary

做:


您没有保留
NSDictionary

做:


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

另一个选项是使用已定义的特性:

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

属性将保留它。

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

另一个选项是使用已定义的特性:

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

属性会保留它。

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

那就放一个

[bookmarks retain];
在你初始化之后,你就完成了。另一个解决方案可以为您保留

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

你不应该在你的行动中释放url。它被释放,一旦你释放了字典,问题是你没有在viewDidLoad方法中保留“书签”。Apple文档中提到了一个命名约定:如果初始化方法以“init…”开头,则返回的对象将被保留,否则您必须自己执行。“dictionaryWithObjectsAndKeys”返回保留计数为0的and对象,这意味着在赋值范围(viewDidLoad方法)之后,它会立即再次释放

那就放一个

[bookmarks retain];
在你初始化之后,你就完成了。另一个解决方案可以为您保留

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


你不应该在你的行动中释放url。一旦你发布了字典,它就会被发布。

不要发布url,valueForKey:返回一个自动删除的对象。@Thierry-使用正确的代码高亮显示不是更快吗?-)欢迎来到这里,这是感谢材料。。。我会试试。@user756245。。。新建此网站并尽我所能。。。但是谢谢你的提示不要释放url,valueForKey:返回一个自动释放的对象。@Thierry-使用适当的代码高亮显示不是更快吗?-)欢迎来到这里,这是感谢材料。。。我会试试。@user756245。。。新建此网站并尽我所能。。。但是谢谢你的提示唯一重要的是,根据对象所有权策略,您不拥有由
dictionaryWithObjectsAndKeys:
返回的对象。是否自动删除是实现的一个细节。@albertamg。是的,没错。这样说更好+1唯一重要的是,根据对象所有权策略,您不拥有由
dictionaryWithObjectsAndKeys:
返回的对象。是否自动删除是实现的一个细节。@albertamg。是的,没错。这样说更好+1如果声明了一个属性,那么只使用它可能会更好。您可以使用它,但它还是一样的,而不是更好;)@albertamg-I
保留
释放
成吨的对象,几乎可以肯定每天属性都封装内存管理代码并减少样板文件。另外,如果声明了一个属性,那么只使用它可能会更好。您可以使用它,但它还是一样的,而不是更好;)@albertamg-I
保留
释放
成吨的对象,几乎可以肯定每天属性都封装内存管理代码并减少样板文件。也,