的NSDictionary在IOS 6
问题描述:
我有此以下代码:的NSDictionary在IOS 6
NSAssert(dst, @"sdiasiosadiodasio");
// Add to a list so that we don't lose the references
[layersToDsts setObject:dst forKey:layer];
NSLog(@"The key is %lu", layer);
for (Bit *layer in [layersToDsts allKeys])
{
BitHolder *dst = [layersToDsts objectForKey:layer];
NSLog(@"My added key is %lu", layer);
NSAssert(dst, @"ddddd");
}
layersToDsts是一个可变NSDictionary
。我试图用一个对象的地址作为键,映射到另一个对象。
的代码工作在iOS 5,出于某种原因,该代码给出
The key is 484196128
My added key is 484253328
Assertion failure in -[Animator animateImpl:] 'NSInternalInconsistencyException', reason: 'ddddd'
很显然,我加入到词典中的对象不能被检索。该对象不是零。为什么映射键是另一个地址?该代码在iOS 5上工作完美... ...
答
CALayer没有实现NSCopying协议,所以不能用作密钥,使用CALayer的地址,并将其转换为NSNumber你可以替代地能够使用CALayer上的名称属性。
+1
NSValue更适合执行此任务。 –
答
如果你想使用一个对象地址作为键,你应该创建一个包含该地址的对象。例如
[layersToDsts setObject:dst forKey:[NSValue valueWithPointer:layer]];
但是我强烈鼓励你这样做。您应该改为使用正确的密钥,而不要依赖任何特定的对象地址。
但我的代码在iOS 5中工作... ... – SmallChess
@StevenFisher我不同意这是一个重复的...他/他没有询问关键被复制,他/他问为什么代码失败,显然没有意识到密钥被复制。 –
嗯。很公平。不过,该副本是原因。任何需要字典中的密钥不被复制的代码都不适用于任何iOS版本。我想我们必须看到'Layer'的定义才能解决这个问题。 –