Skip to content

Commit 2490353

Browse files
committed
Move all iVars to external storage
1 parent 7b89d17 commit 2490353

File tree

4 files changed

+156
-13
lines changed

4 files changed

+156
-13
lines changed

Source/OCMock/OCClassMockObject.m

Lines changed: 51 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,23 @@
2121
#import "OCMInvocationStub.h"
2222
#import "NSMethodSignature+OCMAdditions.h"
2323

24+
@interface OCClassMockObjectInstanceVars : NSObject
25+
@property (nonatomic) Class mockedClass;
26+
@property (nonatomic) Class originalMetaClass;
27+
@property (nonatomic) Class classCreatedForNewMetaClass;
28+
@end
29+
30+
@implementation OCClassMockObjectInstanceVars
31+
@end
32+
2433
@interface OCClassMockObject ()
25-
@property (nonatomic) Class mockedClass;
26-
@property (nonatomic) Class originalMetaClass;
27-
@property (nonatomic) Class classCreatedForNewMetaClass;
34+
@property (nonatomic) Class mockedClass;
35+
@property (nonatomic) Class originalMetaClass;
36+
@property (nonatomic) Class classCreatedForNewMetaClass;
2837
@end
2938

39+
static const char *OCClassMockObjectInstanceVarsKey = "OCClassMockObjectInstanceVarsKey";
40+
3041
@implementation OCClassMockObject
3142

3243
#pragma mark Initialisers, description, accessors, etc.
@@ -37,6 +48,10 @@ - (id)initWithClass:(Class)aClass
3748
[NSException raise:NSInvalidArgumentException format:@"Class cannot be Nil."];
3849

3950
self = [super init];
51+
OCClassMockObjectInstanceVars *vars = [[OCClassMockObjectInstanceVars alloc] init];
52+
objc_setAssociatedObject(self, OCClassMockObjectInstanceVarsKey, vars, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
53+
[vars release];
54+
4055
self.mockedClass = aClass;
4156
[self prepareClassForClassMethodMocking];
4257
return self;
@@ -53,9 +68,40 @@ - (NSString *)description
5368
return [NSString stringWithFormat:@"OCClassMockObject(%@)", NSStringFromClass(self.mockedClass)];
5469
}
5570

71+
#pragma mark Setters/Getters
72+
73+
- (OCClassMockObjectInstanceVars *)classMockObjectInstanceVars {
74+
return objc_getAssociatedObject(self, OCClassMockObjectInstanceVarsKey);
75+
}
76+
5677
- (Class)mockedClass
5778
{
58-
return _mockedClass;
79+
return self.classMockObjectInstanceVars.mockedClass;
80+
}
81+
82+
- (Class)classCreatedForNewMetaClass
83+
{
84+
return self.classMockObjectInstanceVars.classCreatedForNewMetaClass;
85+
}
86+
87+
- (Class)originalMetaClass
88+
{
89+
return self.classMockObjectInstanceVars.originalMetaClass;
90+
}
91+
92+
- (void)setMockedClass:(Class)mockedClass
93+
{
94+
self.classMockObjectInstanceVars.mockedClass = mockedClass;
95+
}
96+
97+
- (void)setClassCreatedForNewMetaClass:(Class)classCreatedForNewMetaClass
98+
{
99+
self.classMockObjectInstanceVars.classCreatedForNewMetaClass = classCreatedForNewMetaClass;
100+
}
101+
102+
- (void)setOriginalMetaClass:(Class)originalMetaClass
103+
{
104+
self.classMockObjectInstanceVars.originalMetaClass = originalMetaClass;
59105
}
60106

61107

@@ -209,7 +255,7 @@ - (Class)mockObjectClass
209255

210256
- (Class)class
211257
{
212-
return _mockedClass;
258+
return self.mockedClass;
213259
}
214260

215261
- (BOOL)respondsToSelector:(SEL)selector

Source/OCMock/OCMockObject.m

Lines changed: 62 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,20 @@
3030
#import "OCMExceptionReturnValueProvider.h"
3131
#import "OCMExpectationRecorder.h"
3232

33+
@interface OCMockObjectInstanceVars : NSObject
34+
@property (nonatomic) BOOL isNice;
35+
@property (nonatomic) BOOL expectationOrderMatters;
36+
@property (nonatomic, assign) NSMutableArray *stubs;
37+
@property (nonatomic, assign) NSMutableArray *expectations;
38+
@property (nonatomic, assign) NSMutableArray *exceptions;
39+
@property (nonatomic, assign) NSMutableArray *invocations;
40+
@end
41+
42+
@implementation OCMockObjectInstanceVars
43+
@end
44+
45+
static const char *OCMockObjectInstanceVarsKey = "OCMockObjectInstanceVarsKey";
46+
3347
@interface OCMockObject ()
3448
@property (nonatomic) BOOL isNice;
3549
@property (nonatomic) BOOL expectationOrderMatters;
@@ -105,11 +119,14 @@ - (instancetype)init
105119
}
106120

107121
// skip initialisation when init is called again, which can happen when stubbing alloc/init
108-
if(self.stubs != nil)
122+
if(self.mockObjectInstanceVars != nil)
109123
{
110124
return self;
111125
}
112126

127+
OCMockObjectInstanceVars *vars = [[OCMockObjectInstanceVars alloc] init];
128+
objc_setAssociatedObject(self, OCMockObjectInstanceVarsKey, vars, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
129+
[vars release];
113130
// no [super init], we're inheriting from NSProxy
114131
self.expectationOrderMatters = NO;
115132
self.stubs = [[NSMutableArray alloc] init];
@@ -184,12 +201,52 @@ - (void)addInvocation:(NSInvocation *)anInvocation
184201
}
185202
}
186203

187-
#pragma mark Public API
204+
# pragma mark Getters/Setters
205+
- (OCMockObjectInstanceVars *)mockObjectInstanceVars {
206+
return objc_getAssociatedObject(self, OCMockObjectInstanceVarsKey);
207+
}
188208

189-
- (void)setExpectationOrderMatters:(BOOL)flag
190-
{
191-
_expectationOrderMatters = flag;
209+
- (BOOL)isNice {
210+
return self.mockObjectInstanceVars.isNice;
211+
}
212+
213+
- (BOOL)expectationOrderMatters {
214+
return self.mockObjectInstanceVars.expectationOrderMatters;
215+
}
216+
- (NSMutableArray *)stubs {
217+
return self.mockObjectInstanceVars.stubs;
192218
}
219+
- (NSMutableArray *)expectations {
220+
return self.mockObjectInstanceVars.expectations;
221+
}
222+
- (NSMutableArray *)exceptions {
223+
return self.mockObjectInstanceVars.exceptions;
224+
}
225+
- (NSMutableArray *)invocations {
226+
return self.mockObjectInstanceVars.invocations;
227+
}
228+
229+
- (void)setIsNice:(BOOL)isNice {
230+
self.mockObjectInstanceVars.isNice = isNice;
231+
}
232+
233+
- (void)setExpectationOrderMatters:(BOOL)expectationOrderMatters {
234+
self.mockObjectInstanceVars.expectationOrderMatters = expectationOrderMatters;
235+
}
236+
- (void)setStubs:(NSMutableArray *)stubs {
237+
self.mockObjectInstanceVars.stubs = stubs;
238+
}
239+
- (void)setExpectations:(NSMutableArray *)expectations {
240+
self.mockObjectInstanceVars.expectations = expectations;
241+
}
242+
- (void)setExceptions:(NSMutableArray *)exceptions {
243+
self.mockObjectInstanceVars.exceptions = exceptions;
244+
}
245+
- (void)setInvocations:(NSMutableArray *)invocations {
246+
self.mockObjectInstanceVars.invocations = invocations;
247+
}
248+
249+
#pragma mark Public API
193250

194251
- (void)stopMocking
195252
{
@@ -200,7 +257,6 @@ - (void)stopMocking
200257
@synchronized(self.invocations)
201258
{
202259
[self.invocations removeAllObjects];
203-
[self.invocations autorelease];
204260
self.invocations = nil;
205261
}
206262
}

Source/OCMock/OCPartialMockObject.m

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,16 @@
2323
#import "OCMInvocationStub.h"
2424
#import "NSInvocation+OCMAdditions.h"
2525

26+
@interface OCPartialMockObjectInstanceVars : NSObject
27+
@property (nonatomic, assign) NSObject *realObject;
28+
@property (nonatomic) NSInvocation *invocationFromMock;
29+
@end
30+
31+
@implementation OCPartialMockObjectInstanceVars
32+
@end
33+
34+
static const char *OCPartialMockObjectInstanceVarsKey = "OCPartialMockObjectInstanceVarsKey";
35+
2636
@interface OCPartialMockObject ()
2737
@property (nonatomic) NSObject *realObject;
2838
@property (nonatomic) NSInvocation *invocationFromMock;
@@ -40,6 +50,9 @@ - (id)initWithObject:(NSObject *)anObject
4050
Class const class = [self classToSubclassForObject:anObject];
4151
[self assertClassIsSupported:class];
4252
self = [super initWithClass:class];
53+
OCPartialMockObjectInstanceVars *vars = [[OCPartialMockObjectInstanceVars alloc] init];
54+
objc_setAssociatedObject(self, OCPartialMockObjectInstanceVarsKey, vars, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
55+
[vars release];
4356
self.realObject = [anObject retain];
4457
[self prepareObjectForInstanceMethodMocking];
4558
return self;
@@ -50,9 +63,30 @@ - (NSString *)description
5063
return [NSString stringWithFormat:@"OCPartialMockObject(%@)", NSStringFromClass(self.mockedClass)];
5164
}
5265

66+
#pragma mark Setters/Getters
67+
68+
- (OCPartialMockObjectInstanceVars *)partialMockObjectInstanceVars {
69+
return objc_getAssociatedObject(self, OCPartialMockObjectInstanceVarsKey);
70+
}
71+
5372
- (NSObject *)realObject
5473
{
55-
return _realObject;
74+
return self.partialMockObjectInstanceVars.realObject;
75+
}
76+
77+
- (void)setRealObject:(NSObject *)realObject
78+
{
79+
self.partialMockObjectInstanceVars.realObject = realObject;
80+
}
81+
82+
- (NSInvocation *)invocationFromMock
83+
{
84+
return self.partialMockObjectInstanceVars.invocationFromMock;
85+
}
86+
87+
- (void)setInvocationFromMock:(NSInvocation *)invocationFromMock
88+
{
89+
self.partialMockObjectInstanceVars.invocationFromMock = invocationFromMock;
5690
}
5791

5892
#pragma mark Helper methods

Source/OCMockTests/OCMockObjectTests.m

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
#import <XCTest/XCTest.h>
1818
#import <OCMock/OCMock.h>
1919
#import "OCMBoxedReturnValueProvider.h"
20-
20+
#import "OCPartialMockObject.h"
21+
#import "OCClassMockObject.h"
2122

2223
#pragma mark Helper classes and protocols for testing
2324

@@ -1100,6 +1101,12 @@ - (void)testUncalledRejectStubDoesNotCountAsExpectation
11001101

11011102
}
11021103

1104+
- (void)testMockObjectsHaveNoInstanceVariables
1105+
{
1106+
XCTAssertEqual(class_getInstanceSize([NSProxy class]), class_getInstanceSize([OCMockObject class]));
1107+
XCTAssertEqual(class_getInstanceSize([NSProxy class]), class_getInstanceSize([OCPartialMockObject class]));
1108+
XCTAssertEqual(class_getInstanceSize([NSProxy class]), class_getInstanceSize([OCClassMockObject class]));
1109+
}
11031110

11041111
@end
11051112

0 commit comments

Comments
 (0)