Releases: ronaldoussoren/pyobjc
Release list
v12.2.2
v12.2.1
-
#670: A number of test files were in a directory name
with lower-case letters where upper-case letters should have been
used. This only affects users checking out the repository on
systems with a case-sensitive filesystem. -
#671: Fix build error in the Quartz bindings when the SDK
is for macOS 15 or later and the build target is also macOS 15 or later. -
#659: Implement basic support for handling Swift classes that
have an Objective-C representation but are not subclasses of NSObject,
as used in theNetworkframework.
note
The Network framework builds upon grand central dispatch
(the pyobjc-framework-libdispatch package), and because of that
exceptions in callback handlers will cause a hard crash.
v12.2
-
Update framework bindings for macOS 26.5 SDK
-
The following code failed at the last line in previous versions:
class MyObject(NSObject): pass obj = MyObject() obj.alloc = MyObject.alloc print(obj.alloc) # Raised AttributeError
-
Backward incompatible changes: CFBagCreate and CFBagCreateMutable now match the API in Objective-C, that is, a value for the callbacks argument must be passed (must be kCFTypeBagCallBacks).
-
#663: Fix retain count management for the callbacks registered with DARegisterDiskEjectApprovalCallback, DARegisterDiskMountApprovalCallback, and DARegisterDiskUnmountApprovalCallback in DiskArbitration bindings.
-
“Hidden” instance methods were not hidden when looking them up as an attribute on the class, but found an unbound method as if the method was not hidden.
-
“Hidden” instance methods were visible in dir(SomeClass).
-
#664: Fix anObject.methodForSelector_(some_selector) resolving to a class method IMP when a bound selector object for some_selector is a class attribute.
-
Fixed some memory leaks on unlikely error paths.
-
#637: numbers.Number values are proxies as an NSNumber value.
-
#665: the new of Objective-C classes now also support keyword arguments derived from class selectors of the form valueWithKey1:key2: (with an arbitrary prefix instead of value).
The following calls are now possible (as examples):
-
Foundation.NSHost(address="www.python.org"), returnsFoundation.NSHost.hostWithAddress_("www.python.org"). -
AppKit.NSImage(systemSymbolName="multiply.circle.fill", accessibilityDescription="multiply icon"), returnsAppKit.NSColor.colorWithSystemSymbolName_accessibilityDescription_("multiply.circle.fill", "multiply icon").
-
-
Add
NSMutableData.take_byteson Python 3.15 to mirror the new bytearray method of the same name. -
Rewrite the construction of objects representing method and function metadata, this should result in (slightly) less memory usage.
-
This release gets the testsuite for pyobjc-core to a point where there is comprehensive test coverage for the entire bridge. All extension modules now have 100% test coverage according to lcov, although with use for exclusion comments to ignore code blocks that cannot be reached for various reasons (e.g. PyDict_New can fail, but that only happens when running out of memory and it not preproducable during testing).
-
This enables refactoring the code in pyobjc-core with more confidence that this won’t result in unexpected changes in behaviour.
-
Fix error message for invalid argument to a callable with a variable length output buffer argument.
-
Fix error handlign for incomplete struct encodings.
-
Raise better error when specifying a negative array size for (Objective-)C arguments where the size of a buffer is passed as one of the arguments to a method or function.
-
A side effect of this is that a number of manual bindings no longer support passing -1 as the size of a buffer to derive the size from the Python sequence.
-
A Python implementation for a method that returns void and has a single output parameter used to leak a reference to the return value.
-
Fix crash when a Python implementation with a pass-by-reference output argument or return value returns an Objective-C instance that is no longer referenced in Python when the function returns, e.g.:
@objc.objc_method(signature=b"@@:o^@") def myOutput_(self, a): return (1, NSObject.alloc().init())
-
The bridge could pass a null pointer for a function pointer argument in some (unlikely) edge cases instead of raising an error.
-
Fix various crashes related to edge cases in pass-by-reference argument handling (none of which happen are used in bindings for Cocoa frameworks)
-
Metadata with a tuple as the value for
c_array_length_in_argfor an output argument is now honored for methods implemented in Python. -
Fix crash when
c_array_length_in_argmetadata refers to an non-existing argument. -
Fix handling of transient proxy value, such as when Objective-C calls a Python method when the object is kept alive from Objective-C (no active reference in Python).
Edge case found while debugging an unexpected crash in the free-threaded build which uncovered a bug that also affected the regular build (but was not triggered there in the test suite).
-
aValue.methodForSelector_now works when the selector is implemented in Python, the result will be the Python callable (not wrapped in an objc.IMP value). -
#644: A number of constants in the CoreAudio bindings evaluated to byte strings, while the framework expects regular strings.
-
Foundation.NSDecimalNumber can no longer be subclassed in Python.
Subclasses was possible in older versions, but this is something that isn’t supported in Objective-C and has unexpected behaviour.
-
The cobject and c_void_p arguments for opaque pointer types and objc.objc_object are now keyword only.
This should not affect user code because passing these values by value isn’t useful (esp. because the c_void_p argument is the only one that’s useful for interop with 3th-party code).
-
#668: “frozendict” is supported with Python 3.15a7 and later.
-
Instances roundtrip to Objective-C objects similarly as the dict type, including for keyed archiving. For non-keyed archiving a frozendict value is read back as a plain dict.
-
The metadata method on objc.function, objc.selector, and objc.IMP now returns a frozendict instead of a regular dict to indicate that changing the value has no effect.
-
-
#674: Drop GIL when sending KVO notifications
PR by github user Tim Clem.
-
#669: Drop dependency on dis.dis
PR by github user Max Bélanger.Update framework bindings for macOS 26.5 SDK
v12.1
-
#661: 12.0 incorrectly has support for Python 3.9 in
packaging metadata. -
Update framework bindings for the macOS 26.1 SDK
-
Instances of :type:
bytearraycan be used as the argument for
a function or selector that expects a null-terminated C char array. -
Automatically disable KVO usage for subclasses of NSProxy defined
in Python. -
Fix
SystemErrorwhen callingobjc.propertiesForClass(objc.objc_object). -
objc.classAddMethodsno longer supports callable's whose__name__
attribute is a byte string. -
Clearer error messages when an entry in the methods added with
objc.classAddMethodis invalid. -
Using
objc.classAddMethodsto add a method for which a custom
IMP helper has been registered now works correctly (previously
the default libffi IMP implementation was used in these cases),
and likewise for using :funcsetattrto assign methods. -
It is no longer possible to use :func:
objc.classAddMethodsto
override an existing method with an incompatible Objective-C signature,
and likewise for using :func:setattrto do the same.It was already not possible to override a method from a super class
with an incompatible Objective-C signature. -
It is now possible to use an :class:
objc.objc_methodinstance
in the method list argument for :func:objc.classAddMethod. -
-[OC_PythonObject copy]now actually copies the value if the
value is not known to be immutable (such as subclasses of the
builtin number types).
v12.0
-
Drop support for Python 3.9, which will go out of support
before PyObjC 3.12 is released. -
Added
AVFAudioas a separate toplevel package, instead of keeping
it merged in intoAVFoundation.The package is included in the
pyobjc-framework-AVFoundationdistribution. -
Updated metadata for the macOS 26 SDK.
As part of this introduce bindings for the following new framework bindings:
- ARKit
- CompositorServices
- GameSave
There are no bindings for the
MetalPerformancePrimitivesat this time, it is
a low-level C++ library that would require a lot of work to create bindings. -
In macOS 26 a number of type encodings for block arguments include a signature
for the block interface. Update PyObjC runtime introspection to ignore that
information. -
Dropped old metadata scans. That is, all framework bindings are now created
from the most recent macOS SDK headers with some manual additions and annotations.This change required adding manual entries for, in particular, constants that were
renamed in by now old versions of macOS and have been removed from Apple's headers
by now. These will be removed from PyObjC in a future update as well (but after
a transition period where using them will raise a warning).This has the following user visible side effects (as far as they are
visible, most of the the changes below affect versions of macOS that are long gone):-
Accounts: The following constants are no longer available (on the old versions
of macOS where these were available):ACFacebookAppVersionKey,
ACFacebookPermissionGroupKey,ACFacebookPermissionGroupRead,
ACFacebookPermissionGroupReadWrite, andACFacebookPermissionGroupWrite. -
AppKit: The NSFileWrapper class no longer supports with keyword arguments
path,
andserializedRepresentation, and the keyword set(URL, options, error). -
AuthenticationServices: The classes
ASAccountAuthenticationModificationReplacePasswordWithSignInWithAppleRequest
andASAccountAuthenticationModificationUpgradePasswordToStrongPasswordRequest
no longer have a keyword argument set named(user, serviceIdentifier). -
Automator: class
AMBundleActionno longer accepts the keyword set(definition, fromArchive). -
CFNetwork: The following functions were deprecated before macOS 10.6 and were removed
in the macOS 10.15 SDK:CFHTTPReadStreamSetRedirectsAutomatically, and
CFNetServiceSetProtocolSpecificInformation. -
CloudKit:
CKDiscoverUserInfosOperationno longer recognizes the keyword
set(emailAddresses, userRecordIDs).CKFetchDatabaseChangesOperation
no longer recognizes the keyword argumentpreviousServerChangeToken.
CKShareno longer recognizes the keyword argumentsrecordZoneID,
rootRecord, and the keyword set(rootRecord, shareID).
CKSubscriptionno longer recognizes the keyword argumentcoder,
and the keyword sets(recordType, predicate, options),
(recordType, predicate, subscriptionID, options),
(zoneID, options)andzoneID, subscriptionID, options). -
CoreAudio: The following functions are no longer available (all were deprecated between
macOS 10.5 and 10.8, and removed from the macOS 10.15 SDK):
AudioHardwareClaimAudioDeviceID,AudioHardwareDevicesDied,
AudioHardwareDevicePropertyChanged,AudioHardwareDevicesCreated,AudioObjectCreate,
AudioHardwareStreamPropertyChanged,AudioHardwareClaimAudioStreamID,AudioObjectPropertiesChanged,
AudioHardwareStreamsCreated,AudioObjectsPublishedAndDied,
AudioHardwareStreamsDied.The following constants are no longer available because they are not useful
in python code:CA_PREFER_FIXED_POINTandCOREAUDIOTYPES_VERSION. -
CoreData: The constant
NSFetchRequestExpressionTypeis no longer available. -
CoreLocation:
CLBeaconIdentityConstraintno longer supports the
keywordUUIDand the keyword sets(UUID, major)and(UUID, major, minor). -
CoreServices: The following functions are no longer available (all were removed
in the macOS 10.7 SDK):LSInitandLSTerm. -
CoreText: The constant
kCTVersionNumber10_6_7is no longer available. -
CryptoTokenKit: The following constants are no longer available. Use the modern
names instead:TKSmartCardNoSlot,TKSmartCardSlotEmpty,
TKSmartCardSlotProbing,TKSmartCardSlotMuteCard, andTKSmartCardSlotValidCard. -
DiscRecording: The following constants are no longer available:
DRCDTextEncodingASCII,kDRCDTextEncodingASCII,
DRCDTextEncodingISOLatin1Modified, andkDRCDTextEncodingISOLatin1Modified. -
DiskArbitration: The following constants are no longer available:
kDADiskOptionEjectUponLogout,kDADiskOptionMountAutomatic,
kDADiskOptionMountAutomaticNoDefer, andkDADiskOptionPrivate. -
GameController: The struct type registration
GCExtendedGamepadValueChangedHandler
is gone (the existence of this type was a bug). -
ImageCaptureCore: Constant
ICCameraDeviceSupportsFastPTPis no longer
available (only affects macOS 10.11). -
Intents: Removed constant
INMessageReactionTypeEmojiReaction, use
INMessageReactionTypeEmojiinstead. -
Intents:
INAggregatedMessageReactionno longer accepts the keyword set
reactionType, emoji, reactionCount).INMessageno longer accepts
the keyword sets(identifier, conversationIdentifier, content, dateSent, sender, recipients, groupName, serviceName, messageType, referencedMessage, reaction, aggregatedReactions)
and
(identifier, conversationIdentifier, content, dateSent, sender, recipients, groupName, serviceName, messageType, referencedMessage, sticker, reaction, aggregatedReactions). It
does accept these keyword sets without theaggregatedReactionskeyword though. -
Intents: The
INColorclass no longer accepts the keyword set(read, green, blue). -
Intents: The
INHeadUnitclass no longer accepts the keyword set(bluetoothIdentifier, iap2Identifier). -
Intents: The
INMediaSearchclass no longer accepts the keyword set
(mediaType, sortOrder, mediaName, artistName, albumName, genreNames, moodNames, activityNames, releaseDate, reference, mediaIdentifier). -
Intents: The
INStartCallIntentclass no longer accepts the keyword set
(audioRoute, destinationType, contacts, callCapability). -
JavaScriptCore: Constants
WEBKIT_VERSION_*are no longer available. -
LocalAuthentication: The following constants are no longer available:
kLAOptionAuthenticationReasonandkLAOptionUserFallback. -
Metal: The constant
MTLStitchedLibraryOptionStoreLibraryInMetalScript
is no longer available (was only present in a beta SDK) -
MLCompute: Class
MLCOptimizerno longer has a keyword argument nameddescriptor. -
PassKit: The following constants are no longer available:
PKDisbursementRequestScheduleFutureandPKDisbursementRequestScheduleOneTime.Because of this the type
PKDisbursementRequestSchedulehas been removed as well.The metadata for
PKDisbursementAuthorizationControllerhas been removed.Class
PKShareablePassMetadataPreviewno longer accepts the
keyword set(passThumbnail, localizedDescription). -
PubSub: Class
PSFeedno longer accepts the keywordURLand
the keyword set(data, URL).Note that the entire framework was removed in macOS 10.15, and the Python
bindings will be removed in PyObjC 13 at the latest. -
Quartz: The following constants are no longer available:
CGFLOAT_EPSILON,
CA_TEST,CA_TESTABLE_CLASS,CA_TESTABLE,kCGErrorLast. -
Quartz: The following structs are no longer available (all of them contain
callback pointers which aren't used in PyObjC's bindings for the APIs that use
those structs):CGFunctionCallbacks,CGDataProviderCallbacks,
CGPatternCallbacks,CGDataConsumerCallbacks,CGDataProviderDirectAccessCallbacks,
CGDataProviderSequentialCallbacks, andCGPSConverterCallbacks. -
Quartz: The CIColor class no longer accepts the keyword argument
CGColor. -
Quartz: The CIFilterGenerator class no longer accepts the keyword argument
contentsOfURL. -
Quartz: The CIFilterShape class no longer accepts the keyword argument
rect. -
Quartz: The CImage class no longer accepts the keyword sets
(bitmapData, bytesPerRow, size, format, colorSpace),
(CGImage, options),(CGLayer, options),(CVImageBuffer, options),(CVPixelBuffer, options),
(contentsOfURL, options),(data, options),(IOSurface, options),(IOSurface, plance, format, options),
(imageProvider, size, format, colorSpace, options),(texture, size, flipped, colorSpace),
(texture, size, flipped, options),
and keywordsCGImage,CGLayer,CVImageBuffer,CVPixelBuffer,color,contentsOfURL,
dataandIOSurface. -
Quartz: The CIImageAcculator class no longer accepts the keyword set
(extent, format, colorSpace). -
Quartz: The CISampler class no longer accepts the keyword sets
(image, keysAndValues),(image, options),(values, count),(x, y),
(x, y, z),(x, y, z, w),
and keywordsimage,CGAfineTransform,CGPoint,CGRect,string,
andx. -
ScreenSaver: Class
ScreenSaverViewno longer acceptsframeas its
sole keyword argument (always use it in combination with ``isP...
-
v11.1
The major change in this release is aligning behaviour of the core bridge
with clang's documentation for automatic reference counting <https://clang.llvm.org/docs/AutomaticReferenceCounting.html>_
for initializer methods. In particular, PyObjC now correctly models
that methods in the "init" family steal a reference to self and return
a new reference.
In previous version of PyObjC the proxy for [NSObject alloc] would be
marked as 'partially initialized' and would be cleared when the -init method
returns something else then self.
This has two problems:
-
Behaviour is incorrect when
+allocreturns a singleton whose
-initmethod(s) are factory methods (such asNSArrayin
recent versions of macOS) -
The proxy for Objective-C objects needs to contain mutable state.
This in turn requires locking in the implementation to work
correctly with free-threading.
This version drops the concept of "uninitialized" values and correctly models
how reference counts are handled by -init methods.
-
Update framework bindings for the macOS 15.5 SDK
-
Added bindings for the
SecurityUIframework -
Restructure the PyObjC website
The theme of the PyObjC websites is now shibuya
to give a more modern look and feel to the website.The actual content is mostly still the same, with some minor restructuring
of pages. Restructuring will continue in future updates. -
:class:
objc.FSRefnow implements :class:os.PathLike. -
:issue:
642: Fix concurrency issue when creatingNSArrayinstances
usingNSArray.alloc().init....In previous versions the following would fail on recent versions of macOS:
.. sourcecode:: python
value1 = NSArray.alloc()
value2 = NSArray.alloc()value1 = value1.init()
value2 = value2.init()That's a unrealistic code pattern, but the same can be triggered using
NSArray.alloc().init()when run concurrently in multiple threads,
especially when using free-threading. -
Fixing the previous issue required rearchitecting the way partially
initialized objects (e.g. the result ofSomeClass.alloc()are handled,
and has some other user visible behaviour changes (none of which should
affect normal code):-
:class:
objc.UninitializedDeallocWarningis now soft deprecated because
this warning will never be emitted. -
Bit
0x1will never be set in the__flags__attribute of
Objective-C objects. -
The proxied value of an :class:
objc.objc_objectinstance will never
benil, all exceptions about accessing attributes or methods
of a NIL object are gone. -
It is now possible to call methods on a partially initialized object,
in previous versions that would often result in setting the proxied value
tonil. -
It is now possible to call an
initmethod multiple times an an
partially initialized value, e.g.:.. sourcecode:: python
part = SomeClass.alloc()
value1 = part.init()
value2 = part.init()Whether or not this is safe depends on the implementation of the
Objective-C class. In general it is advised to not use this pattern,
but always callSomeClass.alloc().init...()or the more pythonic
SomeClass(...)introduced in PyObjC 10.3. -
The following code accidentally worked in previous versions of PyObjC
and will now crash. Handling of partially initialized objects in previous
versions hides the reference counting bug in this code... sourcecode:: python
class NilObject(NSObject):
def init(self):
self.release()
return None -
The
isAllocattribute of :class:objc.selectoris deprecated and
will be removed in PyObjC 12. -
The bridge no longer uses
CFRetainandCFReleaseto maintain
the reference counts of Objective-C values. The original reason to do
this is no longer needed, there are edge cases where mixing native ObjC
retain count updates with these functions causes problems.
-
-
Python 3.14: Use
PyUnstable_Object_IsUniquelyReferencedto check if the
dealloc helper is uniquely referenced when trying to release it instead of
manually checking the reference count.This fixes an unlikely edge case in the free threading build where checking
the reference count like this is not correct. -
Deprecated :attr:
objc.objc_object.pyobjc_ISA. -
Implement
__class_getitem__for :class:objc.function,
:class:objc.selector. :class:objc.varlist. and
:class:objc.WeakRefThis allows for treating these classes a generic in type annotations.
-
Add some methods to :class:
PyObjCTools.TestSupport.TestCase, in
particular
:meth:assertIsInitializer <PyObjCTools.TestSupport.TestCase.assertIsInitializer,
:meth:assertIsNotInitializer <PyObjCTools.TestSupport.TestCase.assertIsNotInitializer,
:meth:assertDoesFreeResult <PyObjCTools.TestSupport.TestCase.assertDoesFreeResult,
:meth:assertDoesNotFreeResult <PyObjCTools.TestSupport.TestCase.assertDoesNotFreeResult. -
Add implementation for
NSMutableData.resizeto match :meth:bytearray.resizethat
was introduced in Python 3.14. -
Using a instance of a Python class with an
__call__method as
an Objective-C block is now possible. -
Change PyObjC's internal assertions in C code from
PyObjC_Asserttoassert
(and only enable them using debug builds of CPython). This is slightly more efficient
and enables removing error return paths in a number of functions due to internal
APIs that could only fail due to assertion errors. -
Removed some helper code that was used when subclassing a number of
NSDecimalNumber
methods. This should have no effect because overriding these methods is effectifly
impossible anyway on recent versions of macOS. -
Fix some free-threaded race conditions
-
Classes
NSStringandNSMutableStringare marked as "final", which
means these classes can no longer be subclassed.Reason for this is that Cocoa strings have special handling in PyObjC
and trying to subclass these classes in Python will result in crashes. -
The
objc._objcextension no longer performs imports from native code,
all external dependencies are passed in as (private) options from Python
code.This simplifies PyObjC's code, and avoids having imports that are hidden
from analysis tools. -
Remove usage of
pkg_resourcesin PyObjC's setup.py files.This is needed because this library is deprecated in setuptools and will
be removed. -
:issue:
651: Fix build issue on macOS 10.12 by changing the invocation
of sw_vers(1).
PyObjC 11: Support for macOS 15
Version 11.0
The major change in this release is experimental support for free-threading
(PEP 703 <https://peps.python.org/pep-0703/>_) which was introduced
as an experimental feature in Python 3.13.
This required fairly significant changes in the core of PyObjC to change
C Python API use and PyObjC internal APIs (mostly related to the use of
borrowed references).
-
Dropped support for Python 3.8. PyObjC 11 supports Python 3.9 and later.
-
Updated metadata for the macOS 15.2 SDK, including bindings
for the following frameworks:- MediaExtension
- DeviceDiscoveryExtension
-
:issue:
249: Added minimal bindings to the Carbon framework.At this time only some functions and constants related to hotkeys
are available. Please file an issue if you have a usecase for other APIs. -
:issue:
249: Added minimal bindings to the Carbon framework.At this time only some functions and constants related to hotkeys
are available. Please file an issue if you have a usecase for other APIs. -
:issue:
615: Struct wrappers now support a number of functions from
:mod:copy: :func:copy.replace(new in Python 3.13), :func:copy.copy
and :func:copy.deepcopy. -
The
__pyobjc_copy__method has been removed from struct wrappers. This
was never a public API. Use :func:copy.deepcopyinstead. -
:meth:`objc.FSRef.from_path
now supportsos.PathLike`` values as its
arguments (as well as strings). -
:issue:
608: Experimental support for the free-threading mode
introduced in Python 3.13.The core bridge and framework bindings claim compatibility with free-threading
as introduced as an experimental feature in Python 3.13.The support in PyObjC is also an experimental feature: I've reviewed
code for free-threading issues and adjusted it where needed, but the
code has seen only light testing w.r.t. concurrency.Some functionality that's explicitly not thread-safe:
-
Defining an Objective-C class with the same name in multiple threads concurrently.
-
Splitting calls to
allocandinitand callinginitmultiple
times concurrently. E.g.:.. sourcecode:: python
import threading from Cocoa import NSObject v = NSObject.alloc() t_list = [] for _ in range(2): t = threading.Thread(target=lambda: v.init()) t_list.append(t) t.start() for t in t_list: t.join()
-
-
The internal mapping from Python values to their active Objective-C
proxy value now uses weak references. This should not affect user code,
other than being a bit more efficient. -
The internal interfaces for updating this mapping, and the reverse mapping
from Objective-C values to their active Python proxy was changed to remove
a small race condition. This was required for free threading support, but
could in theory also bit hit when using the GIL. -
The data structure for mapping Python values to their Objective-C proxy
has been rewritten to support free threading. This also simplifies the
code, and should be small performance improvement for the regular build
of Python. -
The :exc:
TypeErrorraised when passing a non-sequence value to
some APIs implemented in C now has a__cause__with more detailed
information.This is a side effect of dropping the use of
PySequence_Fastin the
implementation of PyObjC. -
Removed
objc.options._nscoding_version, a private option that is no
longer used. -
Changing the
__block_signature__of a block value when the current
value of the signature is notNoneis no longer possible.Please file an issue if you have a use case for changing the signature
of a block. -
Fix compatibility with Python 3.14 (alpha 3)
-
Removed private function
objc._sizeOfTypebecause its unused. -
Fix memory leak when using Python callables as blocks.
The memory leak also resulted in leaking a reference to the callable
(and hence anything kept alive by that reference). -
The generic
__new__implementation now works as intended when
registering methods that other thaninit...methods. -
Dropped '%n' support in handling printf-format strings for variadic
functions and methods.Two reasons for that: 1) supporting this properly should return the
value writing to the %n location (requiring significant changes) and
2) Apple's libraries require using static strings for '%n' to work (at
least on some platforms and versions of the OS) -
:issue:
633: Fix manual bindings forAVAudioPCMBuffermethods for
getting channel data (floatChannelData,int16ChannelDataand
int32ChannelData) -
:issue:
632: fix broken bindings forCGWindowListCreateImageFromArray. -
The private
__is_magicattribute on :class:objc.objc_objecthas
been renamed to__pyobjc_magic_coookie__. -
Various fixes to edge case behaviour that were found while improving
test coverage.
v10.3.2
-
Fix a number of test failures on macOS 15 These are all documentation and test updates.
-
#593: PyObjCTools.AppHelper.runConsoleEventLoop no longer exits the process on macOS 14 or later when stopping the event loop.
-
#613: Actually expose protocols
KHTTPCookieStoreObserver,WKURLSchemeTask, andWKURLSchemeHandlerin the WebKit bindings. -
Remove workaround for a linker problem in early versions of Xcode 15, which restores support for building with Xcode Command Line tools.
-
The release contains wheels for the free-threaded build of Python 3.13.
Note that PyObjC does not support running without the GIL at this time.
-
Fix for running test suite with recent versions of setuptools
Recent versions of setuptools broke the "test" command, the full command has been reimplemented as part of PyObjC.
-
#627: Fix build issue when deployment target is 15.0 or later.
-
#623: Don't lowercase the first character of the first keyword argument for
__new__when the segment only contains upper case characters.Before this change
initWithURL:mapped to anuRLkeyword argument, with this fix the keyword argument is namedURL.Fix by user @rndblnch on github
-
#625: Fix crash for calling
NSIndexSet.alloc().initWithIndex_(0)This "fix" is a workaround for what appears to be a bug in Foundation.
-
#569: Actually remove the workaround for Xcode 15.0
-
#619: Fix race condition in creating proxy objects for Objective-C classes.
v10.3.1
-
#610: Ensure
__init__can be used when user implements__new__.Version 10.3 dropped support for calling
__init__, but that breaks
a number of popular projects. Reintroduce the ability to use__init__
when a class or one of its super classes contains a user implemenentation
of__new__.Code relying on the
__new__provided by PyObjC still cannot use
__init__for the reason explained in the 10.3 release notes.
v10.3
-
The release contains binary wheels for Python 3.13
PyObjC does at this time not support the experimental free threading
support in Python 3.13. -
#569: Removed the workaround for a bug in Xcode 15.0
The workaround is no longer necessary, and caused problems when
building with the Command Line Tools development tools from Apple. -
Updated SDK bindings for macOS 14.5
-
A minor change in the (currently private) tooling I use for
collecting the raw metadata resulted in minor fixes to the framework
bindings, in particular for metadata for a number of block and function
typed arguments and return values. -
#275: It is now possible to create instances of Objective-C
classes by calling the class, e.g.NSObject()instead of
NSObject.alloc().init().The implementation of
__new__forwards calls to the underlying
SomeClass.alloc().init...()pattern. In particular, all public init
methods are translated into sets of keyword arguments:- Remove
initorinitWithfrom the start of the selector name - Lowercase the first character of what's left over
- The strings before colons are acceptable keywords, in that order
For example, given a selector
initWithX:y:the__new__method
will acceptx, yas keyword arguments, in that order.Framework bindings have been updated with additional metadata to support
this pattern, and the sets of keyword arguments are automatically calculated
for subclasses in written in Python.The limitation on the order of keyword arguments may be lifted in a future
version, it is currently present to keep the code closer to the Objective-C
spelling which should make it easier to look up documentation on Apple's
website. - Remove
-
For some Objective-C classes some of the
initandnewmethods are not
available even if they are available in super classes. Those methods are
marked withNS_UNAVAILABLEin Apple's headers.As of this version these methods are also not available in Python code,
trying to call them will result in an exception.To make methods unavailable in Python classes set these methods to
None,
e.g.:class MyObject(NSObject): init = None # NS_UNAVAILABLE
-
Added :func:
objc.registerUnavailableMethod,
:func:objc.registerNewKeywordsFromSelectorand
:func:objc.registerNewKeywordsto support the generic__new__
in framework bindings.A limitation for
registerUnavailableMethodis that it is currently
not supported to reintroduce the method in a subclass, primarily because
that functionality is not needed for framework bindings. -
Instantiating an Objective-C class by calling the class (e.g. invoking
__new__) will not call__init__even if one is defined.The implementation of a subclass of
NSObjectshould always follow
the Objective-C convention for initializing using one or more
methods with a name starting withinit.This can affect code that manually defines a
__new__method for
an Objective-C class, in previous versions that was the only way
to create instances in a Pythontic way. -
NSArray,NSMutableArray,NSSetandNSMutableSetaccepted
asequencekeyword argument in previous versions. This is no longer supported.It is still supported to create instances using a positional argument
for a sequence, e.g.NSArray([1, 2, 3]). -
NSData,NSMutableData,NSDecimal,NSStringandNSMutableString
accepted avaluekeyword argument in previous versions. This is no longer supported.It is still supported to create instances using a positional argument,
e.g.NSData(b"hello"). -
NSDictionaryandNSMutableDictionarydo not support the
generic new interface because this conflicts with having a similar
interface todictfor creating instances.That is,
NSDictionary(a=4, b=5)is the same asNSDictionary({"a":4, "b":5}),
and not likeNSDictionary.alloc().initWithA_b_(4, 5).