我只是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
非常感谢任何帮助。
吨。
答案 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 ...];
你不应该在你的行动中释放网址。一旦你发布字典
,它就会被释放