Iphone 将objective-c对象与NSDictionary一起使用
我希望根据UILabel存储URL,这样当用户触摸标签时,它会将他们带到UIWebView中的URL 我已经声明了一个类似这样的词典: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
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行是不需要的,这会导致泄漏。