Listing of notable changes by release. More detail is usually found in the Git 
commit messages and/or the pull requests.

OCMock 3.1.4 / 3.1.5 (2015-08-26)

* Fixed deployment target in podspec


OCMock 3.1.3 (2015-08-12)

* Now throwing exception when trying to create mocks for nil (Nick Gravelyn)
* Fixed ARC related bug when boxing macro args (Richard Ross)
* Added target for dynamic iOS framework, which makes OCMock compatible with
  Carthage (Piet Brauer)
* Memory management and other small bug fixes


OCMock 3.1.2 (2015-01-08)

* Fixed bugs around reject and expectation orders (Mason Glidden, Ben Asher)
* Small adjustments to build file and dependencies


OCMock 3.1.1 (2014-08-23)

* Fixed a recently introduced bug that resulted in class arguments and return
  values not to be considered objects (Patrick Hartling, Max Shcheglov)
	

OCMock 3.1 (2014-08-22)

* Converting number types to make andReturn more intuitive (Carl Lindberg)
* Macros now silence warnings about unused return values (Gordon Fontenot)
* Added isKindOfClass constraint (Ash Furrow)
* Performance and stability improvements. As a result it is no longer possible
  use verify-after-running to verify certain methods:
  - All methods implemented by NSObject and categories on it
  - Private methods in core Apple classes, ie. the class name has an NS or UI
    prefix and the method has an underscore prefix and/or suffix.


OCMock 3.0.2 (2014-07-07)

* Fixed podspec


OCMock 3.0.1 (2014-07-06)

* Fixed bug that prevented stubs from returning nil
* Fixed bug related to handling of weak references
* Improved error message when trying to mock undefined method
* Added support for matching of char* arguments


OCMock 3.0 (2014-06-12)

* Added macro for verify with delay
* Fixed several critical bugs
* Allowing nil as block in stub action. With partial mocks this makes it 
  possible to overwrite a method to do nothing (Sam Stigler) 
* More descriptive messages when trying to verify unknown method


OCMock 3.0.M3 (2014-05-31)

* Changed license to Apache 2 license
* Added support for verify-after-run for class methods and for methods sent 
  directly to the real object covered by a partial mock.
* Using a temporary meta class subclass for mocking class methods, enabling
  full clean-up. As a consequence class methods mocked on a given class are no 
  longer mocked in all subclasses. 
* Throwing descriptive exception when attempting to create partial mock on
  toll-free bridged classes and tagged pointers (Mark Larsen)	


OCMock 3.0.M2 (2014-05-07)

* Added support from verify-after-run. Only works for methods that are sent
  to a mock object. Does not work for classes and methods sent directly to 
  the real object covered by a partial mock.
* Failures without location are now thrown as OCMockTestFailure exception, 
  not as NSInternalInconsistencyException


OCMock 3.0.M1 (2014-04-26)

* Added macros for modern syntax
* Automatic deregistration of observer mocks




OCMock 2.2.4 (2014-04-04)

2014-04-05

* Switched unit test for OCMock itself to XCTest.
* Added andForwardToRealObject support for class methods (Carl Lindberg)
* Extended OCMockObject with verifyWithDelay (Charles Harley, Daniel
  Doubrovkine)


OCMock 2.2.2 (2013-12-19)

* Added implementation for Apple-interal NSIsKind informal protocol (Brian 
  Gerstle)
* Various fixes for method with structure returns (Carl Lindberg)
* Added a specially typed method for object references to OCMArg.
* Fixed bug that caused matching to be aborted on first ignored non-object arg.
* Fixed a bug where partial mocks wouldn't clean up mocked class methods.
  (we7teck)
* Improved value macro so it can take constant arguments and expressions. (Carl
  Lindberg)
* Fixed a bug that caused crashes when methods that require "special" struct
  returns were mocked in partial mocks. (Carl Lindberg)


OCMock 2.2.1 (2013-07-24)

* Fixed several bugs regarding class method mocking in class hierarchies.
* Fixed bug preventing the same class method to be expected more than once.


OCMock 2.2 (2013-07-02)

* Can ignore non-object arguments on a per-invocation basis.
* Added constraint for any selector.


OCMock 2.1.2 (2013-06-19)

* Constraints implement NSCopying for OS X 10.9 SDK compatibility.


OCMock 2.1 (2013-03-15)

* Stubbing an object creation method now handles retain count correctly.
* Added support for forwardingTagetForSelector: (thanks to Jeff Watkins)
* Added class method mocking capability to class mock objects
* Added implementation of isKindOfClass: to class mock objects
* Allowing to set non-object pass-by-ref args (thanks to Glenn L. Austin)
* Calling a previously expected method on a partial mock is no longer an error.


OCMock 2.0 (2012-03-02)

* Avoiding deprecated method to convert to a C string (thanks to Kushal
  Pisavadia)
* Recreated project from scratch with new conventions in Xcode 4.2 (thanks to
  Matt Di Pasquale)
* Arguments only need to be equal, don't have to have same class



            
OCMock 1.77 (2011-02-15)

* Added feature to explicitly disable a partial mock
* Updated example to work with iOS 4.2.


OCMock 1.70 (2010-08-21)

* Added feature to explicitly reject methods on nice mocks (thanks to Heath
  Borders)
* Added feature to forward method to real object from partial mock (thanks to
  Marco Sandrini)
* Fix to allow block arguments (thanks to Justin DeWind)
* Now building OCMock library for simulator (i386) and device (armv7)
* Updated example to run tests on device                    
* Changed OCMOCK_VALUE macro to be iOS compatible (thanks to Derek Clarkson)
* Added a new target to build a static library for iOS use
* Created an example showing how to use OCMock in an iOS project
* Various small clean-ups; no change in functionality (thanks to Jonah Williams)
* Added block constraints and invocation handler (thanks to Justin DeWind)


OCMock 1.55 (2009-10-16)

* Fixed broken test for array argument descciptions (Craig Beck)
* Disambiguated mock table method name to avoid compiler warning
* Renamed some variables to avoid warnings when using -Wshadow
* Partial mocks are now deallocated as they should
* Fixed problems that occured when using mocks as arguments
* OnCall methods now have same signature as replaced ones.
* Fixed possible retain bug (Daniel Eggert)
* Added feature that allows to verify expectations are called in sequence.
* Improved detection of unqualified method return type.
* Fixed bug that caused crash when using method swizzling with void return type.
* Added support for calling arbitrary methods when stubbed methods are invoked.
* Added support for posting notifications (based on Jean-Francois Dontigny's
  code)
* Fixed bug around complex type encodings (Jean-Francois Dontigny)
* Partial mocks now work on object reference and self (thanks to Mike Mangino)
* Added partial mocks (calls to the original object reference cannot be mocked)


OCMock 1.42 (2009-05-19)

* Mock observers now handle user infos on notifications.
* Added inital support for mock observers (loosely based on Dave Dribbin's idea)
* Moved factory methods from OCMConstraint to OCMArg
* Added pass by ref argument setters
* Linked install name now uses @rpath (Dave Dribbin)
* Added support for respondsToSelector (Dave Dribin)
* Added constraint for any pointer 
* Now comparing selectors as strings (Dado Colussi)


OCMock 1.29 (2008-07-07)

* Resetting invocation target in recorder to avoid retain cycles.
* Added optional integration with hamcrest for constraints
* Now building quad-fat; the 64-bit versions are somewhat experimental though
* Using new functions to deal with protocols (Evan Doll)
* Added support for void* parameters (Tuukka Norri)
* Fixed a bug that could caused crashes when non-char const pointers were
  described
* Fixed bug to allow mocking of methods with type qualifieres (Nikita Zhuk)
* Added a simple constraint implementation.


OCMock 1.17 (2007-06-04)

* Now re-throwing fail-fast exceptions, for unexpected invocations for example,
  when verify is called; in case the first throw is ignored by a framework.
* Added nice mocks, i.e. mocks that don't raise on unknown methods (Mark Thomas)
* Fixed bug that prevented expectations after invocations (M. Scott Ford)
* Added possibility to throw an exception, based on code by Justin DeWind
* Added Evan Doll's bugfix, which forwards conformsToProtocol: methods when
  necessary
* Added the ability to match struct arguments, based on code contributed by
  Daniel Eggert
* Better description of arguments, based on code contributed by Jeremy Higgs
* Added the ability to create multiple identical expectations on the mock
  object (Jeremy Higgs)
* Added the ability to mock out nil arguments (Jeremy Higgs)
* Added slightly modified version of Jon Reid's contribution, which adds the 
  possibility to stub primitive return values.
* Added Jon Reid's bugfix that prevents a crash when trying to stub an unknown
  method on a protocol.


OCMock 1.10 (2005-10-03)

* Upgraded to build and run tests using the OCUnit that is now part of XCode.
* Added XCode 2.1 project
* Added Richard Clark's contribution, which provides support for scalar
  arguments.
* Added support for mocking formal protocols


OCMock 1.6 (2004-08-30)

* MockObject and Recorder now inherit from NSProxy.

