What's new in PyObjC ==================== An overview of the relevant changes in new, and older, releases. Version 12.2.1 -------------- * :issue:`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. * :issue:`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. * :issue:`659`: Implement basic support for handling Swift classes that have an Objective-C representation but are not subclasses of NSObject, as used in the ``Network`` framework. .. 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. Version 12.2 ------------ * Update framework bindings for macOS 26.5 SDK * The following code failed at the last line in previous versions: .. sourcecode:: python 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``). * :issue:`663`: Fix retain count management for the callbacks registered with :func:`DARegisterDiskEjectApprovalCallback `, :func:`DARegisterDiskMountApprovalCallback `, and :func:`DARegisterDiskUnmountApprovalCallback ` in :doc:`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)``. * :issue:`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. * :issue:`637`: ``numbers.Number`` values are proxies as an ``NSNumber`` value. * :issue:`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")``, returns ``Foundation.NSHost.hostWithAddress_("www.python.org")``. - ``AppKit.NSImage(systemSymbolName="multiply.circle.fill", accessibilityDescription="multiply icon")``, returns ``AppKit.NSColor.colorWithSystemSymbolName_accessibilityDescription_("multiply.circle.fill", "multiply icon")``. * Add ``NSMutableData.take_bytes`` on Python 3.15 to mirror the new :class:`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.: .. sourcecode:: python @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_arg`` for an output argument is now honored for methods implemented in Python. * Fix crash when ``c_array_length_in_arg`` metadata 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 :type:`objc.IMP` value). * A small milestone over the last couple of releases is that test coverage of the C extension in ``pyobjc-core`` is now at 100%, although with a liberal sprinkling of coverage exclusions for conditions that cannot be triggered during testing (such as memory errors). This makes it possible to refactor parts of this extension module with more confidence, and has fixed a number of issues in edge conditions. * :issue:`644`: A number of constants in the CoreAudio bindings evaluated to byte strings, while the framework expects regular strings. * :class:`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 :class:`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). * :issue:`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 :class:`objc.function`, :class:`objc.selector`, and :class:`objc.IMP` now returns a ``frozendict`` instead of a regular dict to indicate that changing the value has no effect. * :issue:`674`: Drop GIL when sending KVO notifications PR by github user `Tim Clem `_. * :issue:`669`: Drop dependency on :func:`dis.dis` PR by github user `Max Bélanger `_. Version 12.1 ------------ * :issue:`661`: 12.0 incorrectly has support for Python 3.9 in packaging metadata. Because of this the 12.0 release has been yanked for the packages ``pyobjc`` and ``pyobjc-core`` on PyPI. * Update framework bindings for the macOS 26.1 SDK * Instances of :type:`bytearray` can 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 :exc:`SystemError` when calling ``objc.propertiesForClass(objc.objc_object)``. * :func:`objc.classAddMethods` no longer supports callable's whose ``__name__`` attribute is a byte string. * Clearer error messages when an entry in the methods added with :func:`objc.classAddMethod` is invalid. * Using :func:`objc.classAddMethods` to 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 :func`setattr` to assign methods. * It is no longer possible to use :func:`objc.classAddMethods` to override an existing method with an incompatible Objective-C signature, and likewise for using :func:`setattr` to 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_method` instance 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). Version 12.0 ------------ * Drop support for Python 3.9, which will go out of support before PyObjC 3.12 is released. * Added ``AVFAudio`` as a separate toplevel package, instead of keeping it merged in into ``AVFoundation``. The package is included in the ``pyobjc-framework-AVFoundation`` distribution. * 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 ``MetalPerformancePrimitives`` at 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``, and ``ACFacebookPermissionGroupWrite``. - AppKit: The NSFileWrapper class no longer supports with keyword arguments ``path``, and ``serializedRepresentation``, and the keyword set ``(URL, options, error)``. - AuthenticationServices: The classes ``ASAccountAuthenticationModificationReplacePasswordWithSignInWithAppleRequest`` and ``ASAccountAuthenticationModificationUpgradePasswordToStrongPasswordRequest`` no longer have a keyword argument set named ``(user, serviceIdentifier)``. - Automator: class ``AMBundleAction`` no 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: ``CKDiscoverUserInfosOperation`` no longer recognizes the keyword set ``(emailAddresses, userRecordIDs)``. ``CKFetchDatabaseChangesOperation`` no longer recognizes the keyword argument ``previousServerChangeToken``. ``CKShare`` no longer recognizes the keyword arguments ``recordZoneID``, ``rootRecord``, and the keyword set ``(rootRecord, shareID)``. ``CKSubscription`` no longer recognizes the keyword argument ``coder``, and the keyword sets ``(recordType, predicate, options)``, ``(recordType, predicate, subscriptionID, options)``, ``(zoneID, options)`` and ``zoneID, 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_POINT`` and ``COREAUDIOTYPES_VERSION``. - CoreData: The constant ``NSFetchRequestExpressionType`` is no longer available. - CoreLocation: ``CLBeaconIdentityConstraint`` no longer supports the keyword ``UUID`` and 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): ``LSInit`` and ``LSTerm``. - CoreText: The constant ``kCTVersionNumber10_6_7`` is no longer available. - CryptoTokenKit: The following constants are no longer available. Use the modern names instead: ``TKSmartCardNoSlot``, ``TKSmartCardSlotEmpty``, ``TKSmartCardSlotProbing``, ``TKSmartCardSlotMuteCard``, and ``TKSmartCardSlotValidCard``. - DiscRecording: The following constants are no longer available: ``DRCDTextEncodingASCII``, ``kDRCDTextEncodingASCII``, ``DRCDTextEncodingISOLatin1Modified``, and ``kDRCDTextEncodingISOLatin1Modified``. - DiskArbitration: The following constants are no longer available: ``kDADiskOptionEjectUponLogout``, ``kDADiskOptionMountAutomatic``, ``kDADiskOptionMountAutomaticNoDefer``, and ``kDADiskOptionPrivate``. - GameController: The struct type registration ``GCExtendedGamepadValueChangedHandler`` is gone (the existence of this type was a bug). - ImageCaptureCore: Constant ``ICCameraDeviceSupportsFastPTP`` is no longer available (only affects macOS 10.11). - Intents: Removed constant ``INMessageReactionTypeEmojiReaction``, use ``INMessageReactionTypeEmoji`` instead. - Intents: ``INAggregatedMessageReaction`` no longer accepts the keyword set ``reactionType, emoji, reactionCount)``. ``INMessage`` no 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 the ``aggregatedReactions`` keyword though. - Intents: The ``INColor`` class no longer accepts the keyword set ``(read, green, blue)``. - Intents: The ``INHeadUnit`` class no longer accepts the keyword set ``(bluetoothIdentifier, iap2Identifier)``. - Intents: The ``INMediaSearch`` class no longer accepts the keyword set ``(mediaType, sortOrder, mediaName, artistName, albumName, genreNames, moodNames, activityNames, releaseDate, reference, mediaIdentifier)``. - Intents: The ``INStartCallIntent`` class 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: ``kLAOptionAuthenticationReason`` and ``kLAOptionUserFallback``. - Metal: The constant ``MTLStitchedLibraryOptionStoreLibraryInMetalScript`` is no longer available (was only present in a beta SDK) - MLCompute: Class ``MLCOptimizer`` no longer has a keyword argument named ``descriptor``. - PassKit: The following constants are no longer available: ``PKDisbursementRequestScheduleFuture`` and ``PKDisbursementRequestScheduleOneTime``. Because of this the type ``PKDisbursementRequestSchedule`` has been removed as well. The metadata for ``PKDisbursementAuthorizationController`` has been removed. Class ``PKShareablePassMetadataPreview`` no longer accepts the keyword set ``(passThumbnail, localizedDescription)``. - PubSub: Class ``PSFeed`` no longer accepts the keyword ``URL`` and 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``, and ``CGPSConverterCallbacks``. - 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 keywords ``CGImage``, ``CGLayer``, ``CVImageBuffer``, ``CVPixelBuffer``, ``color``, ``contentsOfURL``, ``data`` and ``IOSurface``. - 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 keywords ``image``, ``CGAfineTransform``, ``CGPoint``, ``CGRect``, ``string``, and ``x``. - ScreenSaver: Class ``ScreenSaverView`` no longer accepts ``frame`` as its sole keyword argument (always use it in combination with ``isPreview``). - Security: The constant ``SEC_PROTOCOL_CERT_COMPRESSION_DEFAULT`` is no longer available. - ServiceManagement: The following constants are no longer available: ``kSMInfoKeyAuthorizedClients`` and ``kSMInfoKeyPrivilegedExecutables``. - SharedWithYouCore: ``SWCollaborationOption`` no longer has a keyword argument named ``coder``. - SyncServices: Informal protocol ``ISyncSessionDriverDataSourceOptionalMethods`` is no longer available. - SystemConfiguration: The following constants are no longer available: ``kSCEntNetAppleTalk``, ``kSCEntNetNetInfo``, ``kSCNetworkProtocolTypeAppleTalk``, ``kSCPropNetAppleTalkComputerName``, ``kSCPropNetAppleTalkComputerNameEncoding``, ``kSCPropNetAppleTalkConfigMethod``, ``kSCPropNetAppleTalkDefaultZone``, ``kSCPropNetAppleTalkNetworkID``, ``kSCPropNetAppleTalkNetworkRange``, ``kSCPropNetAppleTalkNodeID``, ``kSCPropNetAppleTalkSeedNetworkRange``, ``kSCPropNetAppleTalkSeedZones``, ``kSCPropNetNetInfoBindingMethods``, ``kSCPropNetNetInfoBroadcastServerTag``, ``kSCPropNetNetInfoServerAddresses``, ``kSCPropNetNetInfoServerTags``, ``kSCValNetAppleTalkConfigMethodNode``, ``kSCValNetAppleTalkConfigMethodRouter``, ``kSCValNetAppleTalkConfigMethodSeedRouter``, ``kSCValNetNetInfoBindingMethodsBroadcast``, ``kSCValNetNetInfoBindingMethodsDHCP``, ``kSCValNetNetInfoBindingMethodsManual``, and ``kSCValNetNetInfoDefaultServerTag``. - WebKit: : The following constants are no longer available: ``DOM_VARIABLES_RULE`` and ``WK_API_ENABLED``. - WebKit: ``-[WKWebView callAsyncJavaScript:arguments:inContentWorld:completionHandler:]``, ``-[WKWebView evaluateJavaScript:inContentWorld:completionHandler:]`` block arguments are no longer supported. These methods were in a beta version of the macOS 11 SDK, but are no longer present in SDKs. - WebKit: A number of informal protocol definitions were removed. This should not affect using the library: ``WebUIDelegate``, ``WebViewEditingDelegate``, ``WebPolicyDelegate``, ``WebDownloadDelegate``, ``WebResourceLoadDelegate``, ``WebFrameLoadDelegate``, and ``WebJavaPlugIn``. * Added ``objc.NSInteger``, ``objc.NSUInteger`` and ``objc.CGFloat`` that will make it easier to use type annotations that match Apple's type information. * Fix edge cases in method accessors when some uses of ``SomeClass.pyobjc_instanceMethods.method`` would result in a method object that's bound to a meta class. * Fix memory leak due to incorrect reference count handling in looking up metadata. * Fix edge case in handling registration of multiple custom helpers to call a selector. Version 11.1.1 -------------- The focus of this release is increasing test coverage and fixing issues found while doing this. * Fix a number of edge cases in handling of both calling and implementing ``NSCoder`` methods. Issues found while increasing test coverage. * Fix error handling for a possible ``NULL`` result from ``objc_copyClassList()`` (should not happen in practice, but the API is annotated as nullable). * Fix race condition in recalculating the internal ``sel_methinfo`` of selector objects. * ``NSCoder.encodeBytes_length_forKey_`` now accepts three arguments ( matching PyObjC's regular pattern for binding Objective-C APIs). The older interface still works, but is deprecated and will be removed in PyObjC 13. * Implementing the same method now requires following the PyObjC convention, that is the implementation must have 3 arguments. * Drop some code paths from pyobjc-core's extension module that supported Python 3.8. * Fix some error messages in incorrect invocations of ``objc.function`` instances. * Fix crash when a callable returns a C function with a signature that's not compatible with libffi (such as a function using a SIMD argument or return type). * The :class:`selector` constructor no longer unpacks a selector passed in as the callable. That is, given: .. sourcecode:: python @objc.selector def mymethod_(self, a): pass othermethod = objc.selector(mymethod_, selector=b"hello") In previous versions ``othermethod.callable`` was set to ``mymethod_.callable``, in this version it is set to ``mymethod_``. * Free-threading: Correctly check if instances are uniquely referenced in a couple of locations (``Py_REFCNT(obj) == 1`` in the regular build). * Disabled logic that avoids calling ``[[result retain] autorelease]`` in the implementation of functions and methods that return an object. This can result in higher load on Objective-C's autorelease pools and later deallocation of values. * Free-threading support is no longer experimental. * Fixed a bug in the look-up code that selects the most specific manual override for calling an Objective-C method from Python. In practice PyObjC ships with at most one such override for a selector, the issue was found while improving test coverage for edge cases. * :pr:`653`: Fix building with older clangs versions PR by GitHub user `moubctez `_. * :pr:`604`: Add some internal assertions that validate the state of block proxies Based on a PR by GitHub user `mrpippy `_. * More consistently raise :exc:`objc.error` when an invalid type encoding is encountered (used to sometimes raise :exc:`ValueError` instead). * Passing a :class:`classmethod` instance as the callable argument of :class:`objc.selector` works again (resulting a selector object that is a class method). * Passing a :class:`staticmethod` instance as the callable argument of :class:`objc.selector` now raises an error as intended. * Fix crash when a SIMD type is present in the method signature of a method or function with by-reference arguments. * Fix handling of Python strings as 'self' for NSString methods (which should raise an exception, but didn't). This can only be triggered by using unbound instance methods. * 'free_result' metadata is now accepted even if there is no specific metadata for the result ('retval' key). * Raise a better exception when the registered metadata is not a dictionary (used to raise :exc:`SystemError`, now raises :exc:`TypeError`). * Special handling of "const pointer" results is no longer present (and isn't used by PyObjC's framework bindings). Use 'deref_result' metadata instead. That is, instead of: .. sourcecode:: python objc.registerMetaDataForSelector(b"SomeClass", b"someSelector", "retval": { "type_modifier": objc._C_CONST } ) use: .. sourcecode:: python objc.registerMetaDataForSelector(b"SomeClass", b"someSelector", "retval": { "deref_result": True } ) * Defining methods on Objective-C classes with non-ASCII characters in their name now works. This works both for python methods and selectors (even if the latter are not legal in Objective-C) .. sourcecode:: python class MyClass(NSObject): def zurück(self): # OK, selector return "back" def zurück_fart(self): # OK, regular python method return "return drive" obj = MyClass() print(obj.zurück_fart()) This change primarily allows writing Python methods (``@python_method``) with accented or otherwise non-ascii names to match regular Python classes. * It is no longer possible to register metadata for a selector with more than 64 arguments (which is also the maximum number of arguments in a method call). * Passing strings with characters outside of the BMP now works when the function argument is a null-terminated array of ``unichar``. A side effect of this is that passing strings that cannot be encoded as UTF-16, such as strings containing lone surrogates now fails. * ``SomeClass.pyobjc_instanceMethods.method(someInstance)`` now works, even if ``method`` is hidden on the class (for example by overriding it with something that's not a selector). Version 11.1 ------------ The major change in this release is aligning behaviour of the core bridge with `clang's documentation for automatic reference counting `_ 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: 1. Behaviour is incorrect when ``+alloc`` returns a singleton whose ``-init`` method(s) are factory methods (such as ``NSArray`` in recent versions of macOS) 2. 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 ``SecurityUI`` framework * Restructure the PyObjC website The theme of the PyObjC websites is now [shibuya](https://shibuya.lepture.com) 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.FSRef` now implements :class:`os.PathLike`. * :issue:`642`: Fix concurrency issue when creating ``NSArray`` instances using ``NSArray.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 of ``SomeClass.alloc()`` are handled, and has some other user visible behaviour changes (none of which should affect normal code): * :class:`objc.UninitializedDeallocWarning` is now soft deprecated because this warning will never be emitted. * Bit ``0x1`` will never be set in the ``__flags__`` attribute of Objective-C objects. * The proxied value of an :class:`objc.objc_object` instance will never be ``nil``, 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 to ``nil``. * It is now possible to call an ``init`` method 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 call ``SomeClass.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 ``isAlloc`` attribute of :class:`objc.selector` is deprecated and will be removed in PyObjC 12. * The bridge no longer uses ``CFRetain`` and ``CFRelease`` to 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_IsUniquelyReferenced`` to 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.WeakRef` This allows for treating these classes a generic in type annotations. * Add some methods to :class:`PyObjCTools.TestSupport.TestCase`, in particular :meth:`assertIsInitializer