@@ -48,6 +48,7 @@ - (void)autoEncodeWithCoder:(NSCoder *)coder {
4848 NSString *type = [properties objectForKey: key];
4949 id value;
5050 unsigned long long ullValue;
51+ long long llValue;
5152 BOOL boolValue;
5253 float floatValue;
5354 double doubleValue;
@@ -57,7 +58,6 @@ - (void)autoEncodeWithCoder:(NSCoder *)coder {
5758 unsigned unsignedValue;
5859 short shortValue;
5960 NSString *className;
60-
6161 NSMethodSignature *signature = [self methodSignatureForSelector: NSSelectorFromString (key)];
6262 NSInvocation *invocation = [NSInvocation invocationWithMethodSignature: signature];
6363 [invocation setSelector: NSSelectorFromString (key)];
@@ -76,6 +76,11 @@ - (void)autoEncodeWithCoder:(NSCoder *)coder {
7676 }
7777 }
7878 break ;
79+ case ' B' :
80+ [invocation invoke ];
81+ [invocation getReturnValue: &boolValue];
82+ [coder encodeObject: [NSNumber numberWithBool: boolValue] forKey: key];
83+ break ;
7984 case ' c' : // bool
8085 [invocation invoke ];
8186 [invocation getReturnValue: &boolValue];
@@ -94,7 +99,7 @@ - (void)autoEncodeWithCoder:(NSCoder *)coder {
9499 case ' i' : // int
95100 [invocation invoke ];
96101 [invocation getReturnValue: &intValue];
97- [coder encodeObject: [NSNumber numberWithInt : intValue] forKey: key];
102+ [coder encodeObject: [NSNumber numberWithInteger : intValue] forKey: key];
98103 break ;
99104 case ' L' : // unsigned long
100105 [invocation invoke ];
@@ -106,6 +111,11 @@ - (void)autoEncodeWithCoder:(NSCoder *)coder {
106111 [invocation getReturnValue: &ullValue];
107112 [coder encodeObject: [NSNumber numberWithUnsignedLongLong: ullValue] forKey: key];
108113 break ;
114+ case ' q' : // long long
115+ [invocation invoke ];
116+ [invocation getReturnValue: &llValue];
117+ [coder encodeObject: [NSNumber numberWithLongLong: llValue] forKey: key];
118+ break ;
109119 case ' l' : // long
110120 [invocation invoke ];
111121 [invocation getReturnValue: &longValue];
@@ -130,8 +140,8 @@ - (void)autoEncodeWithCoder:(NSCoder *)coder {
130140- (void )autoDecode : (NSCoder *)coder {
131141 NSDictionary *properties = [self properties ];
132142 for (NSString *key in properties) {
143+ NSString *ivarKey = [@" _" stringByAppendingString:key];
133144 NSString *type = [properties objectForKey: key];
134- id value;
135145 NSNumber *number;
136146 unsigned int addr;
137147 NSInteger i;
@@ -141,81 +151,127 @@ - (void)autoDecode:(NSCoder *)coder {
141151 unsigned long ul;
142152 unsigned long long ull;
143153 long longValue;
154+ long long longLongValue;
144155 unsigned unsignedValue;
145156 short shortValue;
146157 Ivar ivar;
147- double *varIndex;
148158
149- NSString *className;
159+ bool *varIndexBool;
160+ float *varIndexFloat;
161+ double *varIndexDouble;
162+ unsigned long long *varIndexULongLong;
163+ unsigned long *varIndexULong;
164+ long *varIndexLong;
165+ long long *varIndexLongLong;
166+ unsigned *varU;
167+ short *varShort;
150168
169+ NSString *className;
151170 switch ([type characterAtIndex: 0 ]) {
152171 case ' @' : // object
153172 if ([[type componentsSeparatedByString: @" \" " ] count ] > 1 ) {
154173 className = [[type componentsSeparatedByString: @" \" " ] objectAtIndex: 1 ];
155174 Class class = NSClassFromString (className);
156175 // only decode if the property conforms to NSCoding
157176 if ([class conformsToProtocol: @protocol (NSCoding )]){
158- value = [[ coder decodeObjectForKey: key] retain ];
159- addr = ( NSInteger ) &value;
160- object_setInstanceVariable ( self, [key UTF8String ], *( id **)addr) ;
177+ id value = [coder decodeObjectForKey: key];
178+ // object_setInstanceVariable(self, [ivarKey UTF8String], &value) ;
179+ [ self setValue: value forKey: key] ;
161180 }
162181 }
163182 break ;
183+ case ' B' : // bool
184+ number = [coder decodeObjectForKey: key];
185+ b = [number boolValue ];
186+
187+ if ((ivar = class_getInstanceVariable ([self class ], [ivarKey UTF8String ]))) {
188+ varIndexBool = (bool *)(void **)((char *)self + ivar_getOffset (ivar));
189+ *varIndexBool = b;
190+ }
191+ break ;
164192 case ' c' : // bool
165193 number = [coder decodeObjectForKey: key];
166194 b = [number boolValue ];
167- addr = (NSInteger )&b;
168- object_setInstanceVariable (self, [key UTF8String ], *(NSInteger **)addr);
195+ if ((ivar = class_getInstanceVariable ([self class ], [ivarKey UTF8String ]))) {
196+ varIndexBool = (bool *)(void **)((char *)self + ivar_getOffset (ivar));
197+ *varIndexBool = b;
198+ }
169199 break ;
170200 case ' f' : // float
171201 number = [coder decodeObjectForKey: key];
172202 f = [number floatValue ];
173- addr = (NSInteger )&f;
174- object_setInstanceVariable (self, [key UTF8String ], *(NSInteger **)addr);
203+ if ((ivar = class_getInstanceVariable ([self class ], [ivarKey UTF8String ]))) {
204+ varIndexFloat = (float *)(void **)((char *)self + ivar_getOffset (ivar));
205+ *varIndexFloat = f;
206+ }
175207 break ;
176208 case ' d' : // double
177209 number = [coder decodeObjectForKey: key];
178210 d = [number doubleValue ];
179- if ((ivar = class_getInstanceVariable ([self class ], [key UTF8String ]))) {
180- varIndex = (double *)(void **)((char *)self + ivar_getOffset (ivar));
181- *varIndex = d;
211+ if ((ivar = class_getInstanceVariable ([self class ], [ivarKey UTF8String ]))) {
212+ varIndexDouble = (double *)(void **)((char *)self + ivar_getOffset (ivar));
213+ *varIndexDouble = d;
182214 }
183215 break ;
184216 case ' i' : // int
185217 number = [coder decodeObjectForKey: key];
186218 i = [number intValue ];
187- addr = (NSInteger )&i;
188- object_setInstanceVariable (self, [key UTF8String ], *(NSInteger **)addr);
219+ if ((ivar = class_getInstanceVariable ([self class ], [ivarKey UTF8String ]))) {
220+ varIndexLong = (long *)(void **)((char *)self + ivar_getOffset (ivar));
221+ *varIndexLong = i;
222+ }
189223 break ;
190224 case ' L' : // unsigned long
191225 number = [coder decodeObjectForKey: key];
192226 ul = [number unsignedLongValue ];
193- addr = (NSInteger )&ul;
194- object_setInstanceVariable (self, [key UTF8String ], *(NSInteger **)addr);
227+
228+ if ((ivar = class_getInstanceVariable ([self class ], [ivarKey UTF8String ]))) {
229+ varIndexULong = (unsigned long *)(void **)((char *)self + ivar_getOffset (ivar));
230+ *varIndexULong = ul;
231+ }
232+
195233 break ;
196234 case ' Q' : // unsigned long long
197235 number = [coder decodeObjectForKey: key];
198236 ull = [number unsignedLongLongValue ];
199- addr = (NSInteger )&ull;
200- object_setInstanceVariable (self, [key UTF8String ], *(NSInteger **)addr);
237+ addr = (unsigned int )&ull;
238+
239+ if ((ivar = class_getInstanceVariable ([self class ], [ivarKey UTF8String ]))) {
240+ varIndexULongLong = (unsigned long long *)(void **)((char *)self + ivar_getOffset (ivar));
241+ *varIndexULongLong = ull;
242+ }
201243 break ;
202244 case ' l' : // long
203245 number = [coder decodeObjectForKey: key];
204246 longValue = [number longValue ];
205- addr = (NSInteger )&longValue;
206- object_setInstanceVariable (self, [key UTF8String ], *(NSInteger **)addr);
247+ if ((ivar = class_getInstanceVariable ([self class ], [ivarKey UTF8String ]))) {
248+ varIndexLong = (long *)(void **)((char *)self + ivar_getOffset (ivar));
249+ *varIndexLong = longValue;
250+ }
207251 break ;
208252 case ' I' : // unsigned
209253 number = [coder decodeObjectForKey: key];
210254 unsignedValue = [number unsignedIntValue ];
211- addr = (NSInteger )&unsignedValue;
212- object_setInstanceVariable (self, [key UTF8String ], *(NSInteger **)addr);
255+ if ((ivar = class_getInstanceVariable ([self class ], [ivarKey UTF8String ]))) {
256+ varU = (unsigned *)(void **)((char *)self + ivar_getOffset (ivar));
257+ *varU = unsignedValue;
258+ }
213259 break ;
214260 case ' s' : // short
215261 number = [coder decodeObjectForKey: key];
216262 shortValue = [number shortValue ];
217- addr = (NSInteger )&shortValue;
218- object_setInstanceVariable (self, [key UTF8String ], *(NSInteger **)addr);
263+ if ((ivar = class_getInstanceVariable ([self class ], [ivarKey UTF8String ]))) {
264+ varShort = (short *)(void **)((char *)self + ivar_getOffset (ivar));
265+ *varShort = shortValue;
266+ }
267+ break ;
268+ case ' q' : // long long
269+ number = [coder decodeObjectForKey: key];
270+ longLongValue = [number longLongValue ];
271+ if ((ivar = class_getInstanceVariable ([self class ], [ivarKey UTF8String ]))) {
272+ varIndexLongLong = (long long *)(void **)((char *)self + ivar_getOffset (ivar));
273+ *varIndexLongLong = longLongValue;
274+ }
219275 break ;
220276
221277 default :
@@ -224,4 +280,4 @@ - (void)autoDecode:(NSCoder *)coder {
224280 }
225281}
226282
227- @end
283+ @end
0 commit comments