@@ -86,12 +86,10 @@ - (void)stopMocking
86
86
{
87
87
if (realObject != nil )
88
88
{
89
- Class partialMockClass = object_getClass (realObject);
90
89
OCMSetAssociatedMockForObject (nil , realObject);
91
90
object_setClass (realObject, [self mockedClass ]);
92
91
[realObject release ];
93
92
realObject = nil ;
94
- OCMDisposeSubclass (partialMockClass);
95
93
}
96
94
[super stopMocking ];
97
95
}
@@ -150,27 +148,30 @@ - (void)prepareObjectForInstanceMethodMocking
150
148
{
151
149
OCMSetAssociatedMockForObject (self, realObject);
152
150
153
- /* dynamically create a subclass and set it as the class of the object */
154
- Class subclass = OCMCreateSubclass (mockedClass, realObject);
155
- object_setClass (realObject, subclass);
151
+ if (!classCreatedForNewMetaClass)
152
+ {
153
+ classCreatedForNewMetaClass = OCMCreateSubclass (mockedClass, mockedClass);
154
+ }
155
+ object_setClass (realObject, classCreatedForNewMetaClass);
156
156
157
157
/* point forwardInvocation: of the object to the implementation in the mock */
158
158
Method myForwardMethod = class_getInstanceMethod ([self mockObjectClass ], @selector (forwardInvocationForRealObject: ));
159
159
IMP myForwardIMP = method_getImplementation (myForwardMethod);
160
- class_addMethod (subclass , @selector (forwardInvocation: ), myForwardIMP, method_getTypeEncoding (myForwardMethod));
160
+ class_addMethod (classCreatedForNewMetaClass , @selector (forwardInvocation: ), myForwardIMP, method_getTypeEncoding (myForwardMethod));
161
161
162
162
/* do the same for forwardingTargetForSelector, remember existing imp with alias selector */
163
163
Method myForwardingTargetMethod = class_getInstanceMethod ([self mockObjectClass ], @selector (forwardingTargetForSelectorForRealObject: ));
164
164
IMP myForwardingTargetIMP = method_getImplementation (myForwardingTargetMethod);
165
165
IMP originalForwardingTargetIMP = [mockedClass instanceMethodForSelector: @selector (forwardingTargetForSelector: )];
166
- class_addMethod (subclass, @selector (forwardingTargetForSelector: ), myForwardingTargetIMP, method_getTypeEncoding (myForwardingTargetMethod));
167
- class_addMethod (subclass, @selector (ocmock_replaced_forwardingTargetForSelector: ), originalForwardingTargetIMP, method_getTypeEncoding (myForwardingTargetMethod));
166
+ const char *encoding = method_getTypeEncoding (myForwardingTargetMethod);
167
+ class_addMethod (classCreatedForNewMetaClass, @selector (forwardingTargetForSelector: ), myForwardingTargetIMP, encoding);
168
+ class_addMethod (classCreatedForNewMetaClass, @selector (ocmock_replaced_forwardingTargetForSelector: ), originalForwardingTargetIMP, encoding);
168
169
169
170
/* We also override the -class method to return the original class */
170
171
Method myObjectClassMethod = class_getInstanceMethod ([self mockObjectClass ], @selector (classForRealObject ));
171
172
const char *objectClassTypes = method_getTypeEncoding (myObjectClassMethod);
172
173
IMP myObjectClassImp = method_getImplementation (myObjectClassMethod);
173
- class_addMethod (subclass , @selector (class ), myObjectClassImp, objectClassTypes);
174
+ class_addMethod (classCreatedForNewMetaClass , @selector (class ), myObjectClassImp, objectClassTypes);
174
175
175
176
/* Adding forwarder for most instance methods to allow for verify after run */
176
177
NSArray *methodBlackList = @[ @" class" , @" forwardingTargetForSelector:" , @" methodSignatureForSelector:" , @" forwardInvocation:" ,
0 commit comments