Thanks for the suggestions, all.

I think this will probably suit my needs for now.

Mikkel

On 12/02/2011, at 17.06, Andy Lee wrote:

> "super" does not change what class the object thinks it is an instance of. 
> (It's different from C++ in this way, if I remember my C++.) If an object is 
> an instance of class X, [self class] *always* returns X.
> 
> Suppose you call [obj tagDict] where obj is an instance of SubClass. This is 
> what happens:
> 
> "if ([self class] ..." fails, so you fall through to the [super tagDict] 
> call. The message dispatcher sees the "super" and looks for an implementation 
> of tagDict one level up in the class hierarchy, and finds that SuperClass 
> implements it, so it calls that implementation.
> 
> "if ([self class] ..." again fails (because [self class] still returns 
> SubClass), so again you fall through to the [super tagDict] call. The message 
> dispatcher looks for an implementation of tagDict one level up in the class 
> hierarchy, but SuperClass's superclass does not implement tagDict, hence the 
> error.
> 
> I *think* this is what's happening. To test my theory, use the debugger or 
> NSLog statements to trace the logic that is being executed.
> 
> You can fix this by doing something like this (note this is quick untested 
> code and there might be a smarter and/or more efficient approach):
> 
> -(NSDictionary *)tagDictForClass:(Class)aClass
> {
>       NSMutableDictionary *dict = //built from plist, different for each class
> 
>       if (aClass == [SuperClass class]]) {
>               return dict; // we don't go above our own root
>       }
> 
>       NSDictionary *superDict = [self tagDictForClass:[aClass superclass]];
> 
>       [dict addEntriesFromDictionary:superDict];
> 
>       return dict;
> }
> 
> -(NSDictionary *)tagDict
> {
>       return [self tagDictForClass:[self class]];
> }
> 
> --Andy
> 
> 
> On Feb 12, 2011, at 8:52 AM, Mikkel Eide Eriksen wrote:
> 
>> Hi all,
>> 
>> I think I may have misunderstood something about how super works. In trying 
>> to build a dictionary that contains key/value pairs from the class itself as 
>> well as super classes up to an arbitrary height, I've hit a wall. 
>> Simplified, I have two classes, SuperClass and SubClass. In SuperClass, the 
>> following method is implemented:
>> 
>> -(NSDictionary *)tagDict
>> {
>>      NSMutableDictionary *dict = //built from plist, different for each class
>>      if ([self class] == [SuperClass class]) {
>>              return dict; // we don't go above our own root
>>      }
>>      
>>      NSEnumerator *keyE = [[super tagDict] keyEnumerator]; //HERE
>>      id key;
>>      
>>      while (key = [keyE nextObject]) {
>>              [dict setValue:[[super tagDict] valueForKey:key]];
>>      }
>>      
>>      return [dict copy];
>> }
>> 
>> When this runs, it works fine if I call tagDict on an instance of 
>> SuperClass, but if I try with SubClass, I get:
>> 
>> -[SubClass tagDict]: unrecognized selector sent to instance 0x20038efe0
>> 
>> But shouldn't it keep calling upwards until I reach the SuperClass, then 
>> stop and return my finished dict? I see that it appears to be calling 
>> [SubClass tagDict] which is the very method it's already in (so the selector 
>> can't very well be unrecognized, or what?)...
>> 
>> Regards,
>> Mikkel_______________________________________________
>> 
>> 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/aglee%40mac.com
>> 
>> This email sent to ag...@mac.com
> 

Attachment: smime.p7s
Description: S/MIME cryptographic signature

_______________________________________________

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