NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
A bridge between an Objective C runtime environment and Python.
Last release 4 days ago
30 Sep 2026
Ships fairly regularly
a new release about every 4 months
Nearly every release is documented
notes for 33 of 34 stable releases
1 version withdrawn
withdrawn after publishing
12 years old
37 releases · first in 2014
iOS is now actively tested as part of Rubicon's development process.
AppKit library before being imported. (#806)NSString by an object that defines __rmul__, but not __index__, will now correctly fall back to the __rmul__ implementation on the "other" object. (#816)encoding_for_ctype() now raises ValueError for a C type with no known encoding; previously it raised an AttributeError. Raising ValueError was (and remains) the documented behavior. (#826)platform.processor() provided by the Python library to be fully functioning. This wasn't the case for BeeWare Apple support packages prior to 2022; this legacy support has been removed. (#820)One column per quarter.
Release candidate 1 for Rubicon ObjC 0.5.7.
Release candidate 1 for Rubicon ObjC 0.5.7.
When used on iOS, Rubicon ObjC no longer attempts to import NSEvent.
NSEvent. (#786)If an NSApplication using the CocoaEventLoop stops the event loop, Rubicon ObjC now guarantees that the stop message is processed, ensuring the app fu
NSApplication using the CocoaEventLoop stops the event loop, Rubicon ObjC now guarantees that the stop message is processed, ensuring the app fully shuts down. (#784)CFLifecycle will now use the default run loop if a loop instance isn't provided when it is constructed.
CFLifecycle will now use the default run loop if a loop instance isn't provided when it is constructed. (#746)AGENTS.md file and Spec Kit constitution to provide assistance for Generative AI tools. (#751)CocoaLifecycle event loop no longer terminates the NSApplication instance when it stops. (#745)context keyword argument used when adding and removing socket readers in Python 3.15.0a8. (#747)Support for Python 3.15 was added.
The name of the deprecated AbstractEventLoopPolicy symbol has been corrected to reflect the restoration of the original name in 3.14.0rc1.
AbstractEventLoopPolicy symbol has been corrected to reflect the restoration of the original name in 3.14.0rc1. (#619)The interface with EventLoopPolicy was updated to account for the eventual deprecation of that API in Python.
RubiconEventLoop() is now exposed as an interface for creating a CoreFoundation compatible event loop. (#557)asyncio.new_event_loop() after installing an instance of rubicon.objc.eventloop.EventLoopPolicy, you can call RubiconEventLoop() to instantiate an instance of an event loop and use that instance directly. This approach can be used on all versions of Python; on Python 3.13 and earlier, RubiconEventLoop() is a shim that performs the older event loop policy-based instantiation. (#557)Retain Objective-C objects when creating Python wrappers and release them when the Python wrapped is garbage collected. This means that manual retain
retain calls and subsequent release or autorelease calls from Python are no longer needed with very few exceptions, for example when writing implementations of copy that return an existing object. (#256)release or autorelease no longer cause Rubicon to skip releasing an Objective-C object when its Python wrapper is garbage collected. This means that fewer retain than release calls will cause segfaults on garbage collection. Review your code carefully for unbalanced retain and release calls before updating. (#256)Objective-C methods with repeated argument names can now be called by using a __ suffix in the Python keyword argument to provide a unique name.
__ suffix in the Python keyword argument to provide a unique name. (#148)Name clashes caused by re-registering Objective C classes and protocols can now be automatically avoided by marking the class with auto_rename.
auto_rename. (#181)__repr__ output for ObjCBoundMethod, ObjCClass, ObjCInstance, ObjCMethod, ObjCPartialMethod, and ObjCProtocol were simplified. (#432)__all__ definition for rubicon.objc was corrected to use strings, rather than symbols. (#401)The __repr__ and __str__ implementations for NSPoint, CGPoint, NSRect, CGRect, NSSize, CGSize, NSRange, CFRange, NSEdgeInsets and UIEdgeInsets have be
__repr__ and __str__ implementations for NSPoint, CGPoint, NSRect, CGRect, NSSize, CGSize, NSRange, CFRange, NSEdgeInsets and UIEdgeInsets have been improved. (#222)objc_id and objc_block are now exposed as part of the rubicon.objc namespace, rather than requiring an import from rubicon.objc.runtime. (#225)from __future__ import annotations). (#308)NSRunLoop, rather than a CFRunLoop. (#317)Rubicon now uses an implicit namespace package, instead of relying on the deprecated pkg_resources API.
pkg_resources API. (#292)Classes that undergo a class name change between alloc() and init() (e.g., NSWindow becomes NSKVONotifying_Window) no longer trigger instance cache ev
alloc() and init() (e.g., NSWindow becomes NSKVONotifying_Window) no longer trigger instance cache eviction logic. (#258)Due to an incompatibility with Toga 0.3.0dev39, Rubicon-ObjC 0.4.4 was yanked from PyPI. This RC1 release was published so that development versions o
Due to an incompatibility with Toga 0.3.0dev39, Rubicon-ObjC 0.4.4 was yanked from PyPI. This RC1 release was published so that development versions of Toga could access the bug fixes contained in that release.
Due to [an incompatibility with Toga 0.3.0dev39](https://github.com/beeware/toga/issues/1750), Rubicon-ObjC 0.4.4 was yanked from PyPI.
Due to an incompatibility with Toga 0.3.0dev39, Rubicon-ObjC 0.4.4 was yanked from PyPI.
Support for Python 3.11 has been added.
argtypes when calling send_super. (#220)Added autoreleasepool context manager to mimic Objective-C @autoreleasepool blocks.
Added autoreleasepool context manager to mimic Objective-C @autoreleasepool blocks. (#213)
Allow storing Python objects in Objective-C properties declared with @objc_property. (#214)
Added support for Python 3.10. (#218)
Raise TypeError when trying to declare a weak property of a non-object type. (#215)
Corrected handling of methods when a class overrides a method defined in a grandparent. (#216)
Added official support for Python 3.9.
Added official support for Python 3.9. (#193)
Added official support for macOS 11 (Big Sur). (#195)
Autorelease Objective-C instances when the corresponding Python instance is destroyed. (#200)
Improved memory management when a Python instance is assigned to a new ObjCInstance attribute. (#209)
Added support to declare weak properties on custom Objective-C classes. (#210)
Fixed incorrect behavior of Block when trying to create a block with no arguments and using explicit types. This previously caused an incorrect exception about missing argument types; now a no-arg block is created as expected. (#153)
Fixed handling of type annotations when passing a bound Python method into Block. (#153)
A cooperative entry point for starting event loop has been added. This corrects a problem seen when using Python 3.8 on iOS. (#182)
Improved performance of Objective-C method calls and ObjCInstance creation in many cases. (#183)
Fix calling of signal handlers added to the asyncio loop with CFRunLoop integration. (#202)
Allow restarting a stopped event loop. (#205)
Removed automatic conversion of Objective-C numbers (NSNumber and NSDecimalNumber) to Python numbers when received from Objective-C (i.e. returned from an Objective-C method or property or passed into an Objective-C method implemented in Python). This automatic conversion significantly slowed down every Objective-C method call that returns an object, even though the conversion doesn't apply to most method calls. If you have code that receives an Objective-C number and needs to use it as a Python number, please convert it explicitly using py_from_ns or an appropriate Objective-C method.
As a side effect, NSNumber and NSDecimalNumber values stored in Objective-C collections (NSArray, NSDictionary) are also no longer automatically unwrapped when retrieved from the collection, even when using Python syntax to access the collection. For example, if arr is a NSArray of integer NSNumber, arr[0] now returns an Objective-C NSNumber and not a Python int as before. If you need the contents of an Objective-C collection as Python values, you can use py_from_ns to convert either single values (e.g. py_from_ns(arr[0])) or the entire collection (e.g. py_from_ns(arr)). (#183)
Removed macOS 10.12 through 10.14 from our automatic test matrix, due to pricing changes in one of our CI services (Travis CI). OS X 10.11 is still included in the test matrix for now, but will probably be removed relatively soon. Automatic tests on macOS 10.15 and 11.0 are unaffected as they run on a different CI service (GitHub Actions).
Rubicon will continue to support macOS 10.14 and earlier on a best-effort basis, even though compatibility is no longer tested automatically. If you encounter any bugs or other problems with Rubicon on these older macOS versions, please report them! (#197)
Added macOS 10.15 (Catalina) to the test matrix. #145
517 and 518 build system metadata to pyproject.toml. #156varargs keyword argument to send_message` to allow calling variadic methods more safely. #174ObjCMethod to call methods using send_message instead of calling IMPs directly. This is mainly an internal change and should not affect most existing code, although it may improve compatibility with Objective-C code that makes heavy use of runtime reflection and method manipulation (such as swizzling). #177ObjCInstance.__str__ <rubicon.objc.api.ObjCInstance.__str__> throwing an exception if the object's Objective-C description is nil. #125ctypes never officially supported this, and started generating an error in Python 3.7.6 and 3.8.1 (see bpo-39295). #157NSApplication.terminate() when the CocoaLifecycle` is ended. #170 not accepting SEL objects for the selector parameter. The documentation stated that this is allowed, but actually doing so caused a type error. #177reference documentation </reference/index> for all public APIs of rubicon.objc. #118how-to guide for calling regular C functions </how-to/c-functions> using ctypes and rubicon.objc. #147, removing some previously allowed shortcuts and features that were rarely used, or likely to be used by accident in an unsafe way. In most cases, Rubicon's high-level method call syntax provided by ObjCInstance can be used instead of send_message. This syntax is almost always more convenient to use, more readable and less error-prone. send_message should only be used in cases not supported by the high-level syntax.str/bytes as the receiver argument of send_message. If you need to send a message to a class object (i. e. call a class method), use ObjCClass or get_class to look up the class, and pass the resulting ObjCClass or Class` object as the receiver.~ctypes.c_void_p objects as the receiver argument of send_message. The receiver argument now has to be of type objc_id, or one of its subclasses (such as Class), or one of its high-level equivalents (such as ObjCInstance). All Objective-C objects returned by Rubicon's high-level and low-level APIs have one of these types. If you need to send a message to an object pointer stored as ~ctypes.c_void_p, ~ctypes.cast it to objc_id` first.'s restypeandargtypes keyword arguments. Every send_message call now needs to have its return and argument types set explicitly. This ensures that all arguments and the return value are converted correctly between (Objective-)C and Python.argtypes. This was previously allowed to support calling variadic methods - any arguments beyond the types set in argtypes would be passed as varargs. However, this feature was easy to misuse by accident, as it allowed passing extra arguments to any method, even though most Objective-C methods are not variadic. Extra arguments passed this way were silently ignored without causing an error or a crash. To prevent accidentally passing too many arguments like this, the number of arguments now has to exactly match the number of argtypes. Variadic methods can still be called, but the varargs now need to be passed as a list into the separate varargs keyword arugment. #174rubicon.objc.core_foundation module. This was an internal module with few remaining contents and should not have any external uses. If you need to call Core Foundation functions in your code, please load the framework yourself using load_library('CoreFoundation') and define the types and functions that you need. #175ObjCMethod class from the public API, as there was no good way to use it from external code. #177pyproject.toml. (#156)varargs keyword argument to [send_message][rubicon.objc.runtime.send_message] to allow calling variadic methods more safely. (#174)ObjCMethod to call methods using [send_message][rubicon.objc.runtime.send_message] instead of calling [IMP][rubicon.objc.runtime.IMP]s directly. This is mainly an internal change and should not affect most existing code, although it may improve compatibility with Objective-C code that makes heavy use of runtime reflection and method manipulation (such as swizzling). (#177)ObjCInstance.__str__][rubicon.objc.api.ObjCInstance.str] throwing an exception if the object's Objective-C description is nil. (#125)ctypes][] never officially supported this, and started generating an error in Python 3.7.6 and 3.8.1 (see bpo-39295). (#157)NSApplication.terminate() when the [CocoaLifecycle][rubicon.objc.eventloop.CocoaLifecycle] is ended. (#170)send_message][rubicon.objc.runtime.send_message] not accepting [SEL][rubicon.objc.runtime.SEL] objects for the selector parameter. The documentation stated that this is allowed, but actually doing so caused a type error. (#177)rubicon.objc][rubicon-objc-module]. (#118)ctypes][] and [rubicon.objc][rubicon-objc-module]. (#147)Removed the i386 architecture from the test matrix. It is still supported on a best-effort basis, but compatibility is not tested automatically. (#139)
Tightened the API of [send_message][rubicon.objc.runtime.send_message], removing some previously allowed shortcuts and features that were rarely used, or likely to be used by accident in an unsafe way.
/// note | Note
In most cases, Rubicon's high-level method call syntax provided by [ObjCInstance][rubicon.objc.api.ObjCInstance] can be used instead of [send_message][rubicon.objc.runtime.send_message]. This syntax is almost always more convenient to use, more readable and less error-prone. [send_message][rubicon.objc.runtime.send_message] should only be used in cases not supported by the high-level syntax.
///
Disallowed passing class names as [str][]/[bytes][] as the receiver argument of [send_message][rubicon.objc.runtime.send_message]. If you need to send a message to a class object (i. e. call a class method), use [ObjCClass][rubicon.objc.api.ObjCClass] or [get_class][rubicon.objc.runtime.get_class] to look up the class, and pass the resulting [ObjCClass][rubicon.objc.api.ObjCClass] or [Class][rubicon.objc.runtime.Class] object as the receiver.
Disallowed passing [c_void_p][ctypes.c_void_p] objects as the receiver argument of [send_message][rubicon.objc.runtime.send_message]. The receiver argument now has to be of type [objc_id][rubicon.objc.runtime.objc_id], or one of its subclasses (such as [Class][rubicon.objc.runtime.Class]), or one of its high-level equivalents (such as [ObjCInstance][rubicon.objc.api.ObjCInstance]). All Objective-C objects returned by Rubicon's high-level and low-level APIs have one of these types. If you need to send a message to an object pointer stored as [c_void_p][ctypes.c_void_p], [cast][ctypes.cast] it to [objc_id][rubicon.objc.runtime.objc_id] first.
Removed default values for [send_message][rubicon.objc.runtime.send_message]'s restype and argtypes keyword arguments. Every [send_message][rubicon.objc.runtime.send_message] call now needs to have its return and argument types set explicitly. This ensures that all arguments and the return value are converted correctly between (Objective-)C and Python.
Disallowed passing more argument values than there are argument types in argtypes. This was previously allowed to support calling variadic methods
- any arguments beyond the types set in argtypes would be passed as varargs. However, this feature was easy to misuse by accident, as it allowed passing extra arguments to any method, even though most Objective-C methods are not variadic. Extra arguments passed this way were silently ignored without causing an error or a crash.
To prevent accidentally passing too many arguments like this, the number of arguments now has to exactly match the number of argtypes. Variadic methods can still be called, but the varargs now need to be passed as a list into the separate varargs keyword argument. (#174)
Removed the rubicon.objc.core_foundation module. This was an internal module with few remaining contents and should not have any external uses. If you need to call Core Foundation functions in your code, please load the framework yourself using load_library('CoreFoundation') and define the types and functions that you need. (#175)
Removed the ObjCMethod class from the public API, as there was no good way to use it from external code. (#177)
Added a workaround for bpo-36880, which caused a "deallocating None" crash when returning structs from methods very often.
rubicon.objc.async module to rubicon.objc.eventloop to avoid conflicts with the Python 3.6 async keyword.Added Pythonic operators and methods on NSString objects, similar to those for NSArray and NSDictionary.
Added Pythonic operators and methods on NSString objects, similar to those for NSArray and NSDictionary.
Removed automatic conversion of NSString objects to str when returned from Objective-C methods. This feature made it difficult to call Objective-C methods on NSString objects, because there was no easy way to prevent the automatic conversion.
In most cases, this change will not affect existing code, because NSString objects now support operations similar to str. If an actual str object is required, the NSString object can be wrapped in a str call to convert it.
Added support for objc_propertys with non-object types.
Added public get_ivar and set_ivar functions for manipulating ivars.
Changed the implementation of objc_property to use ivars instead of Python attributes for storage. This fixes name conflicts in some situations.
Added the [load_library][rubicon.objc.runtime.load_library] function for loading [CDLL][ctypes.CDLL]s by their name instead of their full path.
Split the high-level Rubicon API ([ObjCInstance][rubicon.objc.api.ObjCInstance], [ObjCClass][rubicon.objc.api.ObjCClass], etc.) out of [rubicon.objc.runtime][rubicon-runtime] into a separate [rubicon.objc.api][rubicon-objc-api] module. The [runtime][rubicon-runtime] module now only contains low-level runtime interfaces like [libobjc][rubicon.objc.runtime.libobjc].
This is mostly an internal change, existing code will not be affected unless it imports names directly from [rubicon.objc.runtime][rubicon-runtime].
Moved [c_ptrdiff_t][rubicon.objc.types.c_ptrdiff_t] from [runtime][rubicon-runtime] to [rubicon.objc.types][rubicon-types].
Removed some rarely used names ([IMP][rubicon.objc.runtime.IMP], [Class][rubicon.objc.runtime.Class], [Ivar][rubicon.objc.runtime.Ivar], [Method][rubicon.objc.runtime.Method], [get_ivar][rubicon.objc.runtime.get_ivar], [objc_id][rubicon.objc.runtime.objc_id], [objc_property_t][rubicon.objc.runtime.objc_property_t], [set_ivar][rubicon.objc.runtime.set_ivar]) from the main [rubicon.objc][rubicon-objc-module] namespace.
If needed, these names can be imported explicitly from the [rubicon.objc.runtime][rubicon-runtime] module.
Fixed objc_property setters on non-macOS platforms. (cculianu)
Fixed various bugs in the collection ObjCInstance subclasses:
Fixed getting/setting/deleting items or slices with indices lower than -len(obj). Previously this crashed Python, now an IndexError is raised.
Fixed slices with step size 0. Previously they were ignored and 1 was incorrectly used as the step size, now an IndexError is raised.
Fixed equality checks between Objective-C arrays/dictionaries and non-sequence/mapping objects. Previously this incorrectly raised a TypeError, now it returns False.
Fixed equality checks between Objective-C arrays and sequences of different lengths. Previously this incorrectly returned True if the shorter sequence was a prefix of the longer one, now False is returned.
Fixed calling popitem on an empty Objective-C dictionary. Previously this crashed Python, now a KeyError is raised.
Fixed calling update with both a mapping and keyword arguments on an Objective-C dictionary. Previously the kwargs were incorrectly ignored if a mapping was given, now both are respected.
Fixed calling methods using kwarg syntax if a superclass and subclass define methods with the same prefix, but different names. For example, if a superclass had a method initWithFoo:bar: and the subclass initWithFoo:spam:, the former could not be called on instances of the subclass.
Fixed the internal ctypes_patch module so it no longer depends on a non-public CPython function.
Rewrote almost all Core Foundation-based functions to use Foundation instead.
Rewrote almost all Core Foundation-based functions to use Foundation instead.
- The functions
from_valueandNSDecimalNumber.from_decimalhave > been removed and replaced byns_from_py. > - The functionatis now an alias forns_from_py. > - The functionis_strhas been removed.is_str(obj)calls should > be replaced withisinstance(obj, NSString). > - The functionsto_list,to_number,to_set,to_str, and >to_valuehave been removed and replaced bypy_from_ns.
Fixed declare_property not applying to subclasses of the class it was called on.
Fixed repr of ObjCBoundMethod when the wrapped method is not an ObjCMethod.
Fixed the encodings of NSPoint, NSSize, and NSRect on 32-bit systems.
Renamed the async support package to eventloop to avoid a Python 3.5+ keyword clash.
Improved handling of Boolean types.
NSDictonary).NSArray arguments, and Python dictionaries as Objective-C NSDictionary arguments.objc_const convenience function to look up global Objective-C object constants in a DLL.ObjCInstance subclasses to be used to represent Objective-C objects of specific classes.NSApplication and UIApplication event loops with Python's asyncio event loop.Removed some runtime function declarations that are deprecated or unlikely to be useful.
NSArray and NSDictionary. (jeamland)ctypes types.PyObjectEncoding to match the real definition of PyObject *.unichar (was previously c_wchar, is now c_ushort).get_selector function. Use the SEL constructor instead.encoding_for_ctype to get the encoding of a type.(#40) Added the ability to explicitly declare no-attribute methods as properties. This is to enable a workaround when Apple introduces read-only prope
Added a more compact syntax for calling Objective-C methods, using Python keyword arguments. (The old syntax is still fully supported and will *not* b
superclass property to ObjCClass.Added objc_property function for adding properties to custom Objective-C subclasses. (Longhanks)
objc_property function for adding properties to custom Objective-C subclasses. (Longhanks)Removed most Python 2 compatibility code.
Dropped support for Python 3.3.
enum.Enum objects to their underlying values when passed to an Objective-C method.setup.py shebang line. (uranusjr)Fixed setting of ObjCClass/ObjCInstance attributes that are not Objective-C properties.
ObjCClass/ObjCInstance attributes that are not Objective-C properties.Dropped support for Python 2. Python 3 is now required, the minimum tested version is Python 3.3.
decimal.Decimal and Objective-C NSDecimal in method arguments and return values.ctypes types.Fixed some issues on ARM64 (iOS 64-bit).
Fixed NSString conversion in a few situations.
NSString conversion in a few situations.Objective-C classes can now be subclassed using Python class syntax, by using an ObjCClass as the superclass.
ObjCClass as the superclass.ObjCSubclass, which is made obsolete by the new subclassing syntax.Objective-C classes and instances can be accessed via ObjCClass and ObjCInstance.
ObjCClass and ObjCInstance.NSString when passed to or returned from a method.ObjCSubclass.Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →