8
8
9
9
#import " NSObject+NSCoding.h"
10
10
#import < objc/runtime.h>
11
- #import < objc/objc-class.h>
12
11
13
12
14
13
@implementation NSObject (NSCoding)
@@ -54,8 +53,11 @@ - (void)autoEncodeWithCoder:(NSCoder *)coder {
54
53
double doubleValue;
55
54
NSInteger intValue;
56
55
unsigned long ulValue;
56
+ long longValue;
57
+ unsigned unsignedValue;
58
+ short shortValue;
57
59
NSString *className;
58
-
60
+
59
61
NSMethodSignature *signature = [self methodSignatureForSelector: NSSelectorFromString (key)];
60
62
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature: signature];
61
63
[invocation setSelector: NSSelectorFromString (key)];
@@ -67,7 +69,7 @@ - (void)autoEncodeWithCoder:(NSCoder *)coder {
67
69
className = [[type componentsSeparatedByString: @" \" " ] objectAtIndex: 1 ];
68
70
Class class = NSClassFromString (className);
69
71
value = [self performSelector: NSSelectorFromString (key)];
70
-
72
+
71
73
// only decode if the property conforms to NSCoding
72
74
if ([class conformsToProtocol: @protocol (NSCoding)]){
73
75
[coder encodeObject: value forKey: key];
@@ -104,6 +106,21 @@ - (void)autoEncodeWithCoder:(NSCoder *)coder {
104
106
[invocation getReturnValue: &ullValue];
105
107
[coder encodeObject: [NSNumber numberWithUnsignedLongLong: ullValue] forKey: key];
106
108
break ;
109
+ case ' l' : // long
110
+ [invocation invoke ];
111
+ [invocation getReturnValue: &longValue];
112
+ [coder encodeObject: [NSNumber numberWithLong: longValue] forKey: key];
113
+ break ;
114
+ case ' s' : // short
115
+ [invocation invoke ];
116
+ [invocation getReturnValue: &shortValue];
117
+ [coder encodeObject: [NSNumber numberWithShort: shortValue] forKey: key];
118
+ break ;
119
+ case ' I' : // unsigned
120
+ [invocation invoke ];
121
+ [invocation getReturnValue: &unsignedValue];
122
+ [coder encodeObject: [NSNumber numberWithUnsignedInt: unsignedValue] forKey: key];
123
+ break ;
107
124
default :
108
125
break ;
109
126
}
@@ -123,6 +140,9 @@ - (void)autoDecode:(NSCoder *)coder {
123
140
double d;
124
141
unsigned long ul;
125
142
unsigned long long ull;
143
+ long longValue;
144
+ unsigned unsignedValue;
145
+ short shortValue;
126
146
Ivar ivar;
127
147
double *varIndex;
128
148
@@ -179,6 +199,25 @@ - (void)autoDecode:(NSCoder *)coder {
179
199
addr = (NSInteger )&ull;
180
200
object_setInstanceVariable (self, [key UTF8String ], *(NSInteger **)addr);
181
201
break ;
202
+ case ' l' : // long
203
+ number = [coder decodeObjectForKey: key];
204
+ longValue = [number longValue ];
205
+ addr = (NSInteger )&longValue;
206
+ object_setInstanceVariable (self, [key UTF8String ], *(NSInteger **)addr);
207
+ break ;
208
+ case ' I' : // unsigned
209
+ number = [coder decodeObjectForKey: key];
210
+ unsignedValue = [number unsignedIntValue ];
211
+ addr = (NSInteger )&unsignedValue;
212
+ object_setInstanceVariable (self, [key UTF8String ], *(NSInteger **)addr);
213
+ break ;
214
+ case ' s' : // short
215
+ number = [coder decodeObjectForKey: key];
216
+ shortValue = [number shortValue ];
217
+ addr = (NSInteger )&shortValue;
218
+ object_setInstanceVariable (self, [key UTF8String ], *(NSInteger **)addr);
219
+ break ;
220
+
182
221
default :
183
222
break ;
184
223
}
0 commit comments