Skip to content

Commit 1d621ab

Browse files
committed
Move all iVars to external storage
1 parent 80eabb1 commit 1d621ab

File tree

4 files changed

+144
-13
lines changed

4 files changed

+144
-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: 61 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];
@@ -158,13 +175,52 @@ - (void)assertInvocationsArrayIsPresent
158175
}
159176
}
160177

178+
# pragma mark Getters/Setters
179+
- (OCMockObjectInstanceVars *)mockObjectInstanceVars {
180+
return objc_getAssociatedObject(self, OCMockObjectInstanceVarsKey);
181+
}
161182

162-
#pragma mark Public API
183+
- (BOOL)isNice {
184+
return self.mockObjectInstanceVars.isNice;
185+
}
163186

164-
- (void)setExpectationOrderMatters:(BOOL)flag
165-
{
166-
_expectationOrderMatters = flag;
187+
- (BOOL)expectationOrderMatters {
188+
return self.mockObjectInstanceVars.expectationOrderMatters;
189+
}
190+
- (NSMutableArray *)stubs {
191+
return self.mockObjectInstanceVars.stubs;
192+
}
193+
- (NSMutableArray *)expectations {
194+
return self.mockObjectInstanceVars.expectations;
167195
}
196+
- (NSMutableArray *)exceptions {
197+
return self.mockObjectInstanceVars.exceptions;
198+
}
199+
- (NSMutableArray *)invocations {
200+
return self.mockObjectInstanceVars.invocations;
201+
}
202+
203+
- (void)setIsNice:(BOOL)isNice {
204+
self.mockObjectInstanceVars.isNice = isNice;
205+
}
206+
207+
- (void)setExpectationOrderMatters:(BOOL)expectationOrderMatters {
208+
self.mockObjectInstanceVars.expectationOrderMatters = expectationOrderMatters;
209+
}
210+
- (void)setStubs:(NSMutableArray *)stubs {
211+
self.mockObjectInstanceVars.stubs = stubs;
212+
}
213+
- (void)setExpectations:(NSMutableArray *)expectations {
214+
self.mockObjectInstanceVars.expectations = expectations;
215+
}
216+
- (void)setExceptions:(NSMutableArray *)exceptions {
217+
self.mockObjectInstanceVars.exceptions = exceptions;
218+
}
219+
- (void)setInvocations:(NSMutableArray *)invocations {
220+
self.mockObjectInstanceVars.invocations = invocations;
221+
}
222+
223+
#pragma mark Public API
168224

169225
- (void)stopMocking
170226
{
@@ -175,7 +231,6 @@ - (void)stopMocking
175231
@synchronized(self.invocations)
176232
{
177233
[self.invocations removeAllObjects];
178-
[self.invocations autorelease];
179234
self.invocations = nil;
180235
}
181236
}

Source/OCMock/OCPartialMockObject.m

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

26+
@interface OCPartialMockObjectInstanceVars : NSObject
27+
@property (nonatomic, assign) NSObject *realObject;
28+
@end
29+
30+
@implementation OCPartialMockObjectInstanceVars
31+
@end
32+
33+
static const char *OCPartialMockObjectInstanceVarsKey = "OCPartialMockObjectInstanceVarsKey";
34+
2635
@interface OCPartialMockObject ()
2736
@property (nonatomic) NSObject *realObject;
2837
@end
@@ -39,6 +48,9 @@ - (id)initWithObject:(NSObject *)anObject
3948
Class const class = [self classToSubclassForObject:anObject];
4049
[self assertClassIsSupported:class];
4150
self = [super initWithClass:class];
51+
OCPartialMockObjectInstanceVars *vars = [[OCPartialMockObjectInstanceVars alloc] init];
52+
objc_setAssociatedObject(self, OCPartialMockObjectInstanceVarsKey, vars, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
53+
[vars release];
4254
self.realObject = [anObject retain];
4355
[self prepareObjectForInstanceMethodMocking];
4456
return self;
@@ -49,9 +61,20 @@ - (NSString *)description
4961
return [NSString stringWithFormat:@"OCPartialMockObject(%@)", NSStringFromClass(self.mockedClass)];
5062
}
5163

64+
#pragma mark Setters/Getters
65+
66+
- (OCPartialMockObjectInstanceVars *)partialMockObjectInstanceVars {
67+
return objc_getAssociatedObject(self, OCPartialMockObjectInstanceVarsKey);
68+
}
69+
5270
- (NSObject *)realObject
5371
{
54-
return _realObject;
72+
return self.partialMockObjectInstanceVars.realObject;
73+
}
74+
75+
- (void)setRealObject:(NSObject *)realObject
76+
{
77+
self.partialMockObjectInstanceVars.realObject = realObject;
5578
}
5679

5780
#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)