OCMReturnValueProvider.m 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. /*
  2. * Copyright (c) 2009-2015 Erik Doernenburg and contributors
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  5. * not use these files except in compliance with the License. You may obtain
  6. * a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  12. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  13. * License for the specific language governing permissions and limitations
  14. * under the License.
  15. */
  16. #import "NSMethodSignature+OCMAdditions.h"
  17. #import "OCMReturnValueProvider.h"
  18. #import "OCMFunctions.h"
  19. @implementation OCMReturnValueProvider
  20. - (instancetype)initWithValue:(id)aValue
  21. {
  22. if ((self = [super init]))
  23. {
  24. returnValue = [aValue retain];
  25. }
  26. return self;
  27. }
  28. - (void)dealloc
  29. {
  30. [returnValue release];
  31. [super dealloc];
  32. }
  33. - (void)handleInvocation:(NSInvocation *)anInvocation
  34. {
  35. if(!OCMIsObjectType([[anInvocation methodSignature] methodReturnType]))
  36. {
  37. @throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"Expected invocation with object return type. Did you mean to use andReturnValue: instead?" userInfo:nil];
  38. }
  39. NSString *sel = NSStringFromSelector([anInvocation selector]);
  40. if([sel hasPrefix:@"alloc"] || [sel hasPrefix:@"new"] || [sel hasPrefix:@"copy"] || [sel hasPrefix:@"mutableCopy"])
  41. {
  42. // methods that "create" an object return it with an extra retain count
  43. [returnValue retain];
  44. }
  45. [anInvocation setReturnValue:&returnValue];
  46. }
  47. @end