2012-09-20 38 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]]; 

但是我強烈鼓勵你這樣做。您應該改爲使用正確的密鑰,而不要依賴任何特定的對象地址。