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

OCMock 3.5.1 (unreleased)

* Switched to Carthage to manage dependencies. This means you must have Carthage
  installed to build OCMock (see https://github.com/Carthage/Carthage). It does
  not mean that OCMock comes with OCHamcrest bundled. When you use OCMock you
  do not have to depend on OCHamcrest and you still have to make sure it is
  available if you want to use it.
* Added description of mock object to the exception that is thrown when the
  mock is used after stopMocking was called (Chaoshuai Lu)
  

OCMock 3.5 (2019-11-17)

* Added macro to tell the mock to ignore non-object arguments (Yura Samsoniuk)
* Added checks, which throw an expection if no interaction happens with a
  mock object inside the stub/expect/reject/verify macros. This helps in cases
  where by accident the real object is used in these macros. (Anton Vlasov)
* Changed stopMocking so that arguments will be forcibly released to break
  retain cycles. This MAY cause some existing tests to fail. However, it
  was always bad practice to use a mock after calling stopMocking. (Ian)
* Added checks, which throw an exception when stopMocking has been called
  and afterwards an attempt is made to use functionality that will definitely
  not work after stopMocking has been called.
* Changed stub so that return value is not retained if the value is the mock
  itself, because that creates a retain cycle. (Anton Vlasov)
* Added support for watchOS (Morgan Chen)


OCMock 3.4.3 (2018-11-04)

* Changed behaviour when a second mock takes over class method mocking from
  an older mock for the same class. Now, stopMocking is no longer called on
  the first mock, which means that the class generated by it stays around 
  until stopMocking is called, directly or from dealloc; see issue #357 for
  details.
* Changed sequence in which steps are taken to swap out class methods, in
  order to improve thread-safety; see issue #328 for details. (Lily Ballard)


OCMock 3.4.2 (2018-06-25)

* Skipping attempt to replace class methods on subclasses of NSManagedObject,
  which fixes a conflict in newer iOS runtimes.
* Skipping initialisation of mock when init is called again. This allows to
  stub alloc/init; with some limitations. (Alan Terranova)
* Removing dynamically created subclasses when a second mock replaces a mock
  for the same class. (David Sansome)
* Retaining class arguments to invocations. (Jack Wu)


OCMock 3.4.1 (2017-11-04)

* Added workaround for crashes when mocking NSManagedObjects. As a side effect
  it is no longer possible to verify the invocation of class methods on
  NSManagedObject; see issue #338 for details.
* Fixed a memory leak with andThrow:. (Nick Gillett)
* Fixed bug that prevented protocol mocks from being used with
  invokeWithBlock:. (Christopher McGrath)
* Changed type comparison for structs to match new runtime. (Sylvain Defresne)
* Added polyfill for compilation with 10.9 and lower SDKs. (Sylvain Defresne)


OCMock 3.4 (2016-12-22)

* OCMock now requires iOS 8 as minimum deployment target
* Managed objects can now be mocked (Alan Fineberg, Kyle Van Essen)
* Notifications with a user info dictionary can be observed and verified
  with the macro syntax.
* Now considering structs with unknown names to be the same type as a named
  struct, as long as either the actual definition matches or one of them is
  opaque.
* Fixed bug causing verifyWithDelay to be held up by rejects (Nikolay Kasyanov)
* Fixed bug where a mock would not claim conformance to protocols declared in
  a superclass (Werner Altewischer)


OCMock 3.3.1 (2016-07-01)

* Now throwing an exception when an attempt is made to stub the init method.
* Fixed crash when trying to mock NSArray.


OCMock 3.3 (2016-04-12)

* Made the use of mock objects thread safe. You still have to setup the mocks
  and verify them from a main thread (Ian Anderson)
* Added modern syntax for reject (Piotr Tobolski)


OCMock 3.2.2 (2016-01-20)

* Fixed recently introduced bug that caused crashes when using NULL pointers
  with the pass-by-ref argument setter (Ian Anderson)


OCMock 3.2.1 (2016-01-13)

* Added support for tvOS (Nikita Lutsenko)
* Disposing dynamically generated subclasses after use (David Stites)
* Build script now signs frameworks in releases. The signing identity can
  be changed in the script.


OCMock 3.2 (2015-10-03)

* Can mock dynamic properties (imhuntingwabbits)
* Can invoke blocks passed as arguments to stubs (Stephen Fortune)
* Stubbed exceptions are no longer re-raised in verify
* Fixed C++ compilation issues (Jonathan Crooke, Daniel Demiss)
* Add module support for the OS X framework (Ian Anderson)


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 occurred 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.

