[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Exception when using GSDictionary in corebase

From: Richard Frith-Macdonald
Subject: Re: Exception when using GSDictionary in corebase
Date: Fri, 20 May 2011 17:18:54 +0100

On 20 May 2011, at 17:03, Stefan Bidi wrote:

> Earlier today I committed the first set of changes to CFString.  It now uses 
> libicu instead of NSString.  This will allow a lot of extra functionality to 
> work, include any of the functions that use CFLocale.  Anyway, that's just 
> the background.
> In order to make this work, I moved __CFStringMakeConstantString() to 
> CFString.c and changed it to use CFDictionary instead of NSSet (CFSet doesn't 
> yet exist).  When I did that, I started getting an exception whenever trying 
> to add anything to the dictionary (CFString.c:1173).  It took me a while to 
> figure it out, and it is due to GSDictionary setting GSI_MAP_RETAIN_KEY() 
> being set to call -copyWithZone:.  For some reason, whenever that happens I 
> get a NSCFType does not recognize -copyWithZone: exception.
> I don't understand enough about how GSDictionary works, so I was wondering if 
> anyone could help me out here?  Really, I don't even understand why 
> -copyWithZone: is being called since I just need to object retained, not 
> copied.

What's being copied is a dictionary key.

Dictionary keys are (and must be) always copied as they need to be immutable 
objects.  Strictly speaking all that's really needed technically is that the 
objects must not be mutated (changing their -hash and/or -isEqual:) while they 
are acting as dictionary keys, but the API documentation explicitly states that 
they are copied anyway.

Anyway, your immutable string objects should increment their retain count and 
return themselves when copied, and your mutable string objects should implement 
the copy to return an immutable version.

reply via email to

[Prev in Thread] Current Thread [Next in Thread]