@@ -86,12 +86,10 @@ - (void)stopMocking
8686{
8787 if (realObject != nil )
8888 {
89- Class partialMockClass = object_getClass (realObject);
9089 OCMSetAssociatedMockForObject (nil , realObject);
9190 object_setClass (realObject, [self mockedClass ]);
9291 [realObject release ];
9392 realObject = nil ;
94- OCMDisposeSubclass (partialMockClass);
9593 }
9694 [super stopMocking ];
9795}
@@ -150,27 +148,30 @@ - (void)prepareObjectForInstanceMethodMocking
150148{
151149 OCMSetAssociatedMockForObject (self, realObject);
152150
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);
156156
157157 /* point forwardInvocation: of the object to the implementation in the mock */
158158 Method myForwardMethod = class_getInstanceMethod ([self mockObjectClass ], @selector (forwardInvocationForRealObject: ));
159159 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));
161161
162162 /* do the same for forwardingTargetForSelector, remember existing imp with alias selector */
163163 Method myForwardingTargetMethod = class_getInstanceMethod ([self mockObjectClass ], @selector (forwardingTargetForSelectorForRealObject: ));
164164 IMP myForwardingTargetIMP = method_getImplementation (myForwardingTargetMethod);
165165 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);
168169
169170 /* We also override the -class method to return the original class */
170171 Method myObjectClassMethod = class_getInstanceMethod ([self mockObjectClass ], @selector (classForRealObject ));
171172 const char *objectClassTypes = method_getTypeEncoding (myObjectClassMethod);
172173 IMP myObjectClassImp = method_getImplementation (myObjectClassMethod);
173- class_addMethod (subclass , @selector (class ), myObjectClassImp, objectClassTypes);
174+ class_addMethod (classCreatedForNewMetaClass , @selector (class ), myObjectClassImp, objectClassTypes);
174175
175176 /* Adding forwarder for most instance methods to allow for verify after run */
176177 NSArray *methodBlackList = @[ @" class" , @" forwardingTargetForSelector:" , @" methodSignatureForSelector:" , @" forwardInvocation:" ,
0 commit comments