Skip to content

Commit 717d503

Browse files
committed
Merge pull request greenisus#2 from ivanzoid/master
Added support for unsigned, long, short properties
2 parents f40fe6e + 625f3a2 commit 717d503

File tree

1 file changed

+42
-3
lines changed

1 file changed

+42
-3
lines changed

NSObject+NSCoding.m

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88

99
#import "NSObject+NSCoding.h"
1010
#import <objc/runtime.h>
11-
#import <objc/objc-class.h>
1211

1312

1413
@implementation NSObject (NSCoding)
@@ -54,8 +53,11 @@ - (void)autoEncodeWithCoder:(NSCoder *)coder {
5453
double doubleValue;
5554
NSInteger intValue;
5655
unsigned long ulValue;
56+
long longValue;
57+
unsigned unsignedValue;
58+
short shortValue;
5759
NSString *className;
58-
60+
5961
NSMethodSignature *signature = [self methodSignatureForSelector:NSSelectorFromString(key)];
6062
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
6163
[invocation setSelector:NSSelectorFromString(key)];
@@ -67,7 +69,7 @@ - (void)autoEncodeWithCoder:(NSCoder *)coder {
6769
className = [[type componentsSeparatedByString:@"\""] objectAtIndex:1];
6870
Class class = NSClassFromString(className);
6971
value = [self performSelector:NSSelectorFromString(key)];
70-
72+
7173
// only decode if the property conforms to NSCoding
7274
if([class conformsToProtocol:@protocol(NSCoding)]){
7375
[coder encodeObject:value forKey:key];
@@ -104,6 +106,21 @@ - (void)autoEncodeWithCoder:(NSCoder *)coder {
104106
[invocation getReturnValue:&ullValue];
105107
[coder encodeObject:[NSNumber numberWithUnsignedLongLong:ullValue] forKey:key];
106108
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;
107124
default:
108125
break;
109126
}
@@ -123,6 +140,9 @@ - (void)autoDecode:(NSCoder *)coder {
123140
double d;
124141
unsigned long ul;
125142
unsigned long long ull;
143+
long longValue;
144+
unsigned unsignedValue;
145+
short shortValue;
126146
Ivar ivar;
127147
double *varIndex;
128148

@@ -179,6 +199,25 @@ - (void)autoDecode:(NSCoder *)coder {
179199
addr = (NSInteger)&ull;
180200
object_setInstanceVariable(self, [key UTF8String], *(NSInteger**)addr);
181201
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+
182221
default:
183222
break;
184223
}

0 commit comments

Comments
 (0)