Oh I see. Have to use "pure" CFDictionary.

Well, it's all moot, since I can just story the object with the CALayer. Thanks 
for that!

-- 
Rick

On Feb 1, 2010, at 00:49:23, Roland King wrote:

> As I said in my earlier mail, if I set up a CFDictionary() which is not copy 
> for keys and retain for values, then I don't use tollfree bridging and use 
> the NSMutableDictionary mutators because they don't work. (in my experience)
> 
> I use CFDictionaryAddValue() instead.
> 
> When checking for keys or iterating them, I will happily use the tollfree 
> bridged methods however as I've not had the same problem with them.
> 
> Rick Mann wrote:
>> On Feb 1, 2010, at 00:40:28, Jean-Daniel Dupas wrote:
>>> Don't bother with custom callback, CFType one works with any objects.
>> Well, that was the one I tried first, but it failed with the same error.
>>> Le 1 févr. 2010 à 09:32, Rick Mann a écrit :
>>> 
>>> 
>>>> I tried doing this:
>>>> 
>>>> const void*
>>>> retainCallback(CFAllocatorRef inAlloc, const void* inValue)
>>>> {
>>>>    NSObject* val = (NSObject*) inValue;
>>>>    [val retain];
>>>>    return val;
>>>> }
>>>> void
>>>> releaseCallback(CFAllocatorRef inAlloc, const void* inValue)
>>>> {
>>>>    NSObject* val = (NSObject*) inValue;
>>>>    [val release];
>>>> }
>>>> 
>>>> CFDictionaryKeyCallBacks
>>>> sKeyCallbacks =
>>>> {
>>>>    0,
>>>>    retainCallback,
>>>>    releaseCallback,
>>>>    NULL,
>>>>    NULL,
>>>>    NULL
>>>> };
>>>> 
>>>> CFDictionaryValueCallBacks
>>>> sValCallbacks =
>>>> {
>>>>    0,
>>>>    retainCallback,
>>>>    releaseCallback,
>>>>    NULL,
>>>>    NULL,
>>>>    NULL
>>>> };
>>>> 
>>>> - (BOOL)
>>>> application: (UIApplication*) inApp
>>>>    didFinishLaunchingWithOptions: (NSDictionary*) inOptions
>>>> {          mFactoriesByLayer = (NSMutableDictionary*)
>>>>            CFDictionaryCreateMutable(kCFAllocatorDefault,
>>>>                            3,
>>>>                            &sKeyCallbacks,
>>>>                            &sValCallbacks);
>>>> 
>>>>    .
>>>>    .
>>>>    .
>>>> 
>>>>    [mFactoriesByLayer setObject: factory forKey: factory.layer];
>>>> 
>>>> }
>>>> 
>>>> But the setObject fails.
>>>> 
>>>> However, since you say I can store arbitrary keys on the object, that's 
>>>> the better way to go. I didn't realize one could do this.
>>>> 
>>>> Thanks!
>>>> 
>>>> On Feb 1, 2010, at 00:26:53, Roland King wrote:
>>>> 
>>>> 
>>>>> Tollfree Bridging is a little more complicated than that. They may end up 
>>>>> being the same object under the covers, but even if they are, the 
>>>>> NSDictionary version doesn't come with the range of options that the 
>>>>> CFDictionary does. Just make a CFDictionary(), the default for it is to 
>>>>> retain keys (and values) so it's actually really, really easy; I use them 
>>>>> all over the place for stuff like this.
>>>>> 
>>>>> If a have a non-NSDictionary compatible CFDictionary() like that by the 
>>>>> way I use toll free bridging for reading values from it, but I don't use 
>>>>> it for setting them, it doesn't seem to work.
>>>>> 
>>>>> By the way, CALayer is a KVC compliant class so you can in fact just 
>>>>> store a reference to an arbitrary object in it with
>>>>> 
>>>>> [ layer setValue:value forKey:@"KeyForObjectAssociatedWithLayer" ];
>>>>> 
>>>>> and save yourself a whole world of pain.
>>>>> 
>>>>> Richard Penwell wrote:
>>>>> 
>>>>>> I thought NSDictionary and CFDictionary were the same data object, that 
>>>>>> whole toll free bridging...
>>>>>> An ugly hack would be to cast the pointer to a numeric type, and encode 
>>>>>> that in a NSNumber... but I would feel very very ashamed of doing so.
>>>>>> On Feb 1, 2010, at 3:10 AM, Roland King wrote:
>>>>>> 
>>>>>>> Because NSDictionary requires keys to be copyable because it copies 
>>>>>>> them (it's in the documentation). Use a CFDictionary() instead, you can 
>>>>>>> set it up to retain the keys and do what you want.
>>>>>>> 
>>>>>>> Rick Mann wrote:
>>>>>>> 
>>>>>>> 
>>>>>>>> I'd like to use a CALayer object as a key in a dictionary. The reason 
>>>>>>>> is that when my app detects a hit in a layer, I need to quickly 
>>>>>>>> determine which object I've associated with it. Since I can't store a 
>>>>>>>> reference to an arbitrary object in the CALayer, a dictionary seems to 
>>>>>>>> be the most expedient way to do that.
>>>>>>>> Unfortunately, I can't seem to add my layer as the key (it fails with 
>>>>>>>> "-[CALayer copyWithZone:]: unrecognized selector sent to instance 
>>>>>>>> 0x50132a0"). It's really pretty handy to be able to use any object as 
>>>>>>>> a key, why is this not the case in Obj-C?
>>>>>>>> TIA,
>>>>>>>> Rick
>>>>>>>> _______________________________________________
>>>>>>>> Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)
>>>>>>>> Please do not post admin requests or moderator comments to the list.
>>>>>>>> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
>>>>>>>> Help/Unsubscribe/Update your Subscription:
>>>>>>>> http://lists.apple.com/mailman/options/cocoa-dev/rols%40rols.org
>>>>>>>> This email sent to r...@rols.org
>>>>>>> 
>>>>>>> _______________________________________________
>>>>>>> 
>>>>>>> Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)
>>>>>>> 
>>>>>>> Please do not post admin requests or moderator comments to the list.
>>>>>>> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
>>>>>>> 
>>>>>>> Help/Unsubscribe/Update your Subscription:
>>>>>>> http://lists.apple.com/mailman/options/cocoa-dev/almightylinuxgod%40mac.com
>>>>>>> 
>>>>>>> This email sent to almightylinux...@mac.com
>>>> 
>>>> _______________________________________________
>>>> 
>>>> Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)
>>>> 
>>>> Please do not post admin requests or moderator comments to the list.
>>>> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
>>>> 
>>>> Help/Unsubscribe/Update your Subscription:
>>>> http://lists.apple.com/mailman/options/cocoa-dev/devlists%40shadowlab.org
>>>> 
>>>> This email sent to devli...@shadowlab.org
>>>> 
>>> 
>>> -- Jean-Daniel
>>> 
>>> 
>>> 
>>> 

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to