Iphone 访问词典问题
我是iPhone开发的新手,如果这是一个愚蠢的问题,我深表歉意。我正在根据我正在读的一本书构建各种应用程序,他们的建议之一是构建一个迷你网络浏览器。我原以为这很容易,但尽管大部分都很容易,但我正在认真地与Iphone 访问词典问题,iphone,objective-c,nsdictionary,Iphone,Objective C,Nsdictionary,我是iPhone开发的新手,如果这是一个愚蠢的问题,我深表歉意。我正在根据我正在读的一本书构建各种应用程序,他们的建议之一是构建一个迷你网络浏览器。我原以为这很容易,但尽管大部分都很容易,但我正在认真地与NSDictionary作斗争 我有一个UISegmentedControl用于显示各种书签。UISegmentedControl按钮上显示的书签名称将是我的键,url是与之关联的值 我首先尝试将一个nsdictional声明为私有(全局变量),但由于无法使其工作,我在头文件中声明它,如下所示:
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保留
和释放
成吨的对象,几乎可以肯定每天属性都封装内存管理代码并减少样板文件。也,