39
39
40
40
@interface ObjectMapper ()
41
41
@property (nonatomic , strong ) NSMutableArray *commonDateFormaters;
42
+ @property (nonatomic , strong ) NSMutableArray *classNamesInMainBundle;
43
+ @property (nonatomic , strong ) NSMutableDictionary *mappedClassNames;
42
44
@end
43
45
44
46
@implementation ObjectMapper
@@ -62,6 +64,16 @@ + (ObjectMapper *)sharedInstance
62
64
return singleton;
63
65
}
64
66
67
+ - (id )init
68
+ {
69
+ if (self = [super init ])
70
+ {
71
+ [self populateClassNamesInMainBundle ];
72
+ }
73
+
74
+ return self;
75
+ }
76
+
65
77
#pragma mark - Public Methods -
66
78
67
79
- (id )objectFromSource : (id )source toInstanceOfClass : (Class )class
@@ -103,6 +115,36 @@ - (id)dictionaryFromObject:(NSObject *)object
103
115
104
116
#pragma mark - Private Methods -
105
117
118
+ - (void )populateClassNamesInMainBundle
119
+ {
120
+ self.classNamesInMainBundle = [NSMutableArray array ];
121
+
122
+ int numClasses;
123
+ Class *classes = NULL ;
124
+
125
+ classes = NULL ;
126
+ numClasses = objc_getClassList (NULL , 0 );
127
+
128
+ if (numClasses > 0 )
129
+ {
130
+ classes = (__unsafe_unretained Class *)malloc (sizeof (Class ) * numClasses);
131
+ numClasses = objc_getClassList (classes, numClasses);
132
+
133
+ for (int i = 0 ; i < numClasses; i++)
134
+ {
135
+ @autoreleasepool
136
+ {
137
+ Class class = classes[i];
138
+
139
+ if ([NSBundle bundleForClass: class] == [NSBundle mainBundle ])
140
+ [self .classNamesInMainBundle addObject: NSStringFromClass (class)];
141
+ }
142
+ }
143
+ }
144
+
145
+ free (classes);
146
+ }
147
+
106
148
- (NSArray *)processDictionaryFromArray : (NSArray *)array
107
149
{
108
150
NSMutableArray *result = [NSMutableArray array ];
@@ -215,13 +257,13 @@ - (id)processDictionary:(NSDictionary *)source forClass:(Class)class
215
257
{
216
258
propertyName = [self .instanceProvider propertyNameForObject: object byCaseInsensitivePropertyName: key];
217
259
218
- if ([value isKindOfClass: [NSDictionary class ]] || [value isKindOfClass: [NSArray class ]])
260
+ if (propertyName && ( [value isKindOfClass: [NSDictionary class ]] || [value isKindOfClass: [NSArray class ]]) )
219
261
{
220
262
objectType = [self classFromString: key];
221
263
}
222
264
}
223
265
224
- if (class && object && [object respondsToSelector: NSSelectorFromString (propertyName)])
266
+ if (class && object && propertyName && [object respondsToSelector: NSSelectorFromString (propertyName)])
225
267
{
226
268
ILog (@" Mapping key(%@ ) to property(%@ ) from data(%@ )" , key, propertyName, [value class ]);
227
269
@@ -287,7 +329,10 @@ - (id)processArray:(NSArray *)value forClass:(Class)class
287
329
288
330
- (Class )classFromString : (NSString *)className
289
331
{
290
- Class result = nil ;
332
+ Class result = [self .mappedClassNames objectForKey: className];
333
+
334
+ if (result)
335
+ return result;
291
336
292
337
if (NSClassFromString (className))
293
338
return NSClassFromString (className);
@@ -297,35 +342,21 @@ - (Class)classFromString:(NSString *)className
297
342
298
343
NSString *classNameLowerCase = [className lowercaseString ];
299
344
300
- int numClasses;
301
- Class *classes = NULL ;
302
-
303
- classes = NULL ;
304
- numClasses = objc_getClassList (NULL , 0 );
305
-
306
- if (numClasses > 0 )
345
+ for (NSString *className in self.classNamesInMainBundle )
307
346
{
308
- classes = (__unsafe_unretained Class *)malloc (sizeof (Class ) * numClasses);
309
- numClasses = objc_getClassList (classes, numClasses);
310
-
311
- for (int i = 0 ; i < numClasses; i++)
347
+ @autoreleasepool
312
348
{
313
- @autoreleasepool
349
+ NSString *thisClassNameLowerCase = [className lowercaseString ];
350
+
351
+ if ([thisClassNameLowerCase isEqual: classNameLowerCase] ||
352
+ [[NSString stringWithFormat: @" %@ s" , thisClassNameLowerCase] isEqual: classNameLowerCase] ||
353
+ [[NSString stringWithFormat: @" %@ es" , thisClassNameLowerCase] isEqual: classNameLowerCase])
314
354
{
315
- Class class = classes[i];
316
- NSString *thisClassNameLowerCase = [NSStringFromClass (class) lowercaseString ];
317
-
318
- if ([thisClassNameLowerCase isEqual: classNameLowerCase] ||
319
- [[NSString stringWithFormat: @" %@ s" , thisClassNameLowerCase] isEqual: classNameLowerCase] ||
320
- [[NSString stringWithFormat: @" %@ es" , thisClassNameLowerCase] isEqual: classNameLowerCase])
321
- {
322
- result = class;
323
- break ;
324
- }
355
+ result = NSClassFromString (className);
356
+ [self .mappedClassNames setObject: result forKey: className];
357
+ break ;
325
358
}
326
359
}
327
-
328
- free (classes);
329
360
}
330
361
331
362
return result;
0 commit comments