Iphone 将objective-c对象与NSDictionary一起使用

Iphone 将objective-c对象与NSDictionary一起使用,iphone,objective-c,ipad,nsdictionary,Iphone,Objective C,Ipad,Nsdictionary,我希望根据UILabel存储URL,这样当用户触摸标签时,它会将他们带到UIWebView中的URL 我已经声明了一个类似这样的词典: NSMutableArray *linksArray = [[NSMutableArray alloc] init]; [linksArray addObject: [NSValue valueWithNonretainedObject: newsItem1ReadMoreLabel]]; [linksArray addObject: [NSValue valu

我希望根据UILabel存储URL,这样当用户触摸标签时,它会将他们带到UIWebView中的URL

我已经声明了一个类似这样的词典:

NSMutableArray *linksArray = [[NSMutableArray alloc] init];
[linksArray addObject: [NSValue valueWithNonretainedObject: newsItem1ReadMoreLabel]];
[linksArray addObject: [NSValue valueWithNonretainedObject: newsItem2ReadMoreLabel]];
[linksArray addObject: [NSValue valueWithNonretainedObject: newsItem3ReadMoreLabel]];
[linksArray addObject: [NSValue valueWithNonretainedObject: newsItem4ReadMoreLabel]];
[linksArray addObject: [NSValue valueWithNonretainedObject: newsItem5ReadMoreLabel]];
//NSString *ageLink = @"http://www.theage.com.au";
NSArray *defaultLinks = [NSArray arrayWithObjects: @"1", @"2", @"3", @"4", @"5", nil];
self.urlToLinkDictionary = [[NSMutableDictionary alloc] init];
self.urlToLinkDictionary = [NSDictionary dictionaryWithObjects:defaultLinks forKeys:linksArray];
考虑到我使用了一个
NSValue
作为键,如果我只引用UILabels,我如何获取/设置与该键关联的URL

这就是我所拥有的,但它不起作用:

for(NSValue *key in [self.urlToLinkDictionary allKeys])
{
    if ([key nonretainedObjectValue] == linkedLabel)
    {
        [self.urlToLinkDictionary setValue:[newsItem link] forKey: key];
    }
}

但是我得到了一个错误:“objc_exception_throw”得到了解决

为什么不尝试一种更简单的方法呢。将标签与每个标签关联。标记是一个in整数值,您可以使用它在数组中定位url

创建数组的代码

NSMutableArray* arrayURLs = [NSMutableArray arrayWithCapacity:2];
newsItem1ReadMoreLabel.tag = 0;
[arrayURLs insertObject:urlStringforLabel1 atIndex:newsItem1ReadMoreLabel.tag];
newsItem2ReadMoreLabel.tag = 1;
[arrayURLs insertObject:urlStringforLabel2 atIndex:newsItem2ReadMoreLabel.tag];
然后可以访问相应标签的URL字符串

NSString* url = [arrayURLs objectAtIndex:labelClicked.tag];

这两条线是问题的原因:

self.urlToLinkDictionary = [[NSMutableDictionary alloc] init];
self.urlToLinkDictionary = [NSDictionary dictionaryWithObjects:defaultLinks forKeys:linksArray];
首先为属性指定一个可变数组。然后将不同的不可变数组分配给属性。您原来的可变数组泄漏,因为您没有释放它

该异常是由以下行引起的:

[self.urlToLinkDictionary setValue:[newsItem link] forKey: key];
当您找到它时,self.urlToLinkDictionary是一个不可变的字典。你不能改变它

还有其他问题:

  • linksArray泄漏,因为您从未释放它
  • newsItem1ReadMoreLabel等。它们是什么类型的?为什么要用价值观来包装它们
  • setValue:forKey:是键值编码的一部分。在可变字典上它可以工作,但通过键访问对象的正确方法是setObject:forKey:
  • 通过对字典的键进行线性搜索来搜索字典似乎没有什么意义
不确定这是否是错误的原因,但是正在使用
NSDictionary Dictionary WithObjects
设置urlToLinkDictionary,在这种情况下,循环中的设置值应该失败。使用带有对象的NSMutableDictionary字典。此外,dictionaryWithObjects上方的alloc+init行是不需要的,这会导致泄漏。