This is Catalog.m in view mode; [Download] [Up]
/*-------------------------------------------------------------------------- * * You may freely copy, distribute, and reuse the code in this example. * SHL Systemhouse disclaims any warranty of any kind, expressed or * implied, as to its fitness for any particular use. * * Catalog * * Inherits From: NSObject * * Conforms To: None * * Declared In: Catalog.h * *------------------------------------------------------------------------*/ #import "Catalog.h" #import "AppController.h" #define print_trace(arg,isSet) [[NXApp delegate] perform: \ @selector(console:) withObject: \ [NSArray arrayWithObjects:arg, \ [NSValue value:&isSet withObjCType:"char"], nil]] #define display(arg, isSet) [[NXApp delegate] perform: \ @selector(display:) withObject: \ [NSArray arrayWithObjects:arg, \ [NSValue value:&isSet withObjCType:"char"], nil]] #define ACCESSOR_SET_TEXT "\n\n\n\n\(1) takeValuesFromDictionary:\n\ (2) %s\n北北北北北北北北北北北北>" #define ACCESSOR_GET_TEXT "\n\n\n\n(1) valuesForKeys:\n\ (2) %s\n<北北北北北北北北北北北北" #define IVAR_SET_TEXT "(1) takeValuesFromDictionary:\n\ (2) matched instance variable\n北北北北北北北北北北北北>" #define IVAR_GET_TEXT "(1) valuesForKeys:\n\ (2) matched instance variable\n<北北北北北北北北北北北北" #define KVC_SET_TEXT "\n\n\n(1) takeValuesFromDictionary:\n\ 北北北北北北北北北北北北>" #define KVC_GET_TEXT "\n\n\n(1) valuesForKeys:\n\ <北北北北北北北北北北北北" @implementation Catalog /*-------------------------------------------------------------------------- * Initializing *------------------------------------------------------------------------*/ - (void) dealloc { if (fullname) [fullname release]; if (price) [price release]; if (volumeTitle) [volumeTitle release]; return [super dealloc]; } /*-------------------------------------------------------------------------- * Accessor methods *------------------------------------------------------------------------*/ - authorName { return fullname; } - volumeTitle { return volumeTitle; } - price { id newString, formatString; BOOL isSet = NO; formatString = [NSString stringWithCString: ACCESSOR_GET_TEXT]; newString = [NSString stringWithFormat: formatString, sel_getName(_cmd)]; print_trace(@"(1) valuesForKeys:\n(2) price\n", isSet); display(newString, isSet); return price; } - setPrice: aPrice { id newString, formatString; BOOL isSet = YES; /*-------------------------------------------------------------------------- * the class check is to work around an association bug where different * objects are passed in when value is read from the dataStore vs. when it * is read from the user interface. *------------------------------------------------------------------------*/ if ([aPrice isKindOfClass: [NSNumber class]]) price = [[NSNumber numberWithDouble: ([aPrice doubleValue] + 10.0)] retain]; else price = [[NSNumber numberWithFloat: [aPrice floatValue]] retain]; formatString = [NSString stringWithCString: ACCESSOR_SET_TEXT]; newString = [NSString stringWithFormat: formatString, sel_getName(_cmd)]; [[NXApp delegate] updateObjectView:self]; print_trace(@"(1) takeValuesFromDictionary:\n(2) setPrice:\n", isSet); display(newString, isSet); return self; } /*-------------------------------------------------------------------------- * Key Value Coding protocol *------------------------------------------------------------------------*/ - (BOOL)takeValuesFromDictionary:(NSDictionary *)dictionary { id object, newString; BOOL isSet = YES; [super takeValuesFromDictionary: dictionary]; /*-------------------------------------------------------------------------- * instance variables were set in the call to super, but could not be * displayed visually. we'll do it now. *------------------------------------------------------------------------*/ if (object = [dictionary objectForKey: @"fullname"]) { newString = [NSString stringWithCString: IVAR_SET_TEXT]; [[NXApp delegate] updateObjectView:self]; print_trace( @"(1) takeValuesFromDictionary:\n(2) matched instance variable\n", isSet); display(newString, isSet); } /*-------------------------------------------------------------------------- * any key/value pairs that are handled outside of the accessor / ivar * paradigm must be handled here. *------------------------------------------------------------------------*/ if (object = [dictionary objectForKey: @"title"]) { volumeTitle = [object retain]; newString = [NSString stringWithCString: KVC_SET_TEXT]; [[NXApp delegate] updateObjectView:self]; print_trace(@"(1) takeValuesFromDictionary:\n", isSet); display(newString, isSet); } print_trace(@"北北北北盶n", isSet); return YES; } - (NSDictionary *)valuesForKeys:(NSArray *)keys { id dictionary, newString; BOOL isSet = NO; dictionary = [super valuesForKeys:keys]; /*-------------------------------------------------------------------------- * all instance variables were set in a call to super, but could not * be displayed. we'll do it now. *------------------------------------------------------------------------*/ if ([keys containsObject: @"fullname"]) { newString = [NSString stringWithCString: IVAR_GET_TEXT]; print_trace(@"(1) valuesForKeys:\n(2) matched instance variable\n", isSet); display(newString, isSet); } /*-------------------------------------------------------------------------- * any key / value pairs that are not handled via accessors or ivars * can be specially handled here. we'll display that now. *------------------------------------------------------------------------*/ if ([keys containsObject: @"title"]) { [dictionary setObject: volumeTitle forKey: @"title"]; newString = [NSString stringWithCString: KVC_GET_TEXT]; print_trace(@"(1) valuesForKeys:\n", isSet); display(newString, isSet); } print_trace(@"北北北北盶n", isSet); return dictionary; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.