2012-09-20 36 views
0

我有此以下代码:的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上工作完美... ...

+0

但我的代码在iOS 5中工作... ... – SmallChess

+0

@StevenFisher我不同意这是一个重复的...他/他没有询问关键被复制,他/他问为什么代码失败,显然没有意识到密钥被复制。 –

+0

嗯。很公平。不过,该副本是原因。任何需要字典中的密钥不被复制的代码都不适用于任何iOS版本。我想我们必须看到'Layer'的定义才能解决这个问题。 –

回答

3

CALayer没有实现NSCopying协议,所以不能用作密钥,使用CALayer的地址,并将其转换为NSNumber你可以替代地能够使用CALayer上的名称属性。

+1

NSValue更适合执行此任务。 –

1

如果你想使用一个对象地址作为键,你应该创建一个包含该地址的对象。例如

[layersToDsts setObject:dst forKey:[NSValue valueWithPointer:layer]]; 

但是我强烈鼓励你这样做。您应该改为使用正确的密钥,而不要依赖任何特定的对象地址。