# API Review for 1.0

For the 1.0 release, all APIs should be reviewed, as starting with 1.0, they are supposed to be stable. All documented methods, functions, classes, types and structs that are part of the installed headers are considered part of the API.

Right now, we have fhe following installed headers:

* ✅ `ObjFW/macros.h`
* ✅ `ObjFW/objfw-defs.h`
* ✅ `ObjFW/ObjFW.h`
* ✅ `ObjFW/OFAcceptFailedException.h`
* ✅ `ObjFW/OFAllocFailedException.h`
* ✅ `ObjFW/OFAlreadyConnectedException.h`
* ✅ `ObjFW/OFApplication.h`
* ✅ `ObjFW/OFArchiveEntry.h`
* ✅ `ObjFW/OFArray.h`
* ✅ `ObjFW/OFAtomic.h`
* ✅ `ObjFW/OFBindFailedException.h`
* ✅ `ObjFW/OFBlock.h`
* ✅ `ObjFW/OFChangeCurrentDirectoryFailedException.h`
* ✅ `ObjFW/OFCharacterSet.h`
* ✅ `ObjFW/OFChecksumMismatchException.h`
* ✅ `ObjFW/OFCollection.h`
* ✅ `ObjFW/OFColor.h`
* ✅ `ObjFW/OFConditionBroadcastFailedException.h`
* ✅ `ObjFW/OFCondition.h`
* ✅ `ObjFW/OFConditionSignalFailedException.h`
* ✅ `ObjFW/OFConditionStillWaitingException.h`
* ✅ `ObjFW/OFConditionWaitFailedException.h`
* ✅ `ObjFW/OFConnectionFailedException.h`
* ✅ `ObjFW/OFConstantString.h`
* ✅ `ObjFW/OFCopyItemFailedException.h`
* ✅ `ObjFW/OFCountedSet.h`
* ✅ `ObjFW/OFCreateDirectoryFailedException.h`
* ✅ `ObjFW/OFCreateSymbolicLinkFailedException.h`
* ✅ `ObjFW/OFCreateWindowsRegistryKeyFailedException.h`
* ✅ `ObjFW/OFCryptographicHash.h`
* ✅ `ObjFW/OFData+CryptographicHashing.h`
* ✅ `ObjFW/OFDatagramSocket.h`
* ✅ `ObjFW/OFData.h`
* ✅ `ObjFW/OFData+MessagePackParsing.h`
* ✅ `ObjFW/OFDate.h`
* ✅ `ObjFW/OFDeleteWindowsRegistryKeyFailedException.h`
* ✅ `ObjFW/OFDeleteWindowsRegistryValueFailedException.h`
* ✅ `ObjFW/OFDictionary.h`
* ✅ `ObjFW/OFDNSQueryFailedException.h`
* ✅ `ObjFW/OFDNSQuery.h`
* ✅ `ObjFW/OFDNSResolver.h`
* ✅ `ObjFW/OFDNSResourceRecord.h`
* ✅ `ObjFW/OFDNSResponse.h`
* ✅ `ObjFW/OFEnumerationMutationException.h`
* ✅ `ObjFW/OFEnumerator.h`
* ✅ `ObjFW/OFException.h`
* ✅ `ObjFW/OFFile.h`
* ✅ `ObjFW/OFFileManager.h`
* ✅ `ObjFW/OFGetCurrentDirectoryFailedException.h`
* ✅ `ObjFW/OFGetItemAttributesFailedException.h`
* ✅ `ObjFW/OFGetOptionFailedException.h`
* ✅ `ObjFW/OFGetWindowsRegistryValueFailedException.h`
* ✅ `ObjFW/OFGZIPStream.h`
* ✅ `ObjFW/OFHashAlreadyCalculatedException.h`
* ✅ `ObjFW/OFHashNotCalculatedException.h`
* ✅ `ObjFW/OFHMAC.h`
* ✅ `ObjFW/OFHTTPClient.h`
* ✅ `ObjFW/OFHTTPCookie.h`
* ✅ `ObjFW/OFHTTPCookieManager.h`
* ✅ `ObjFW/OFHTTPRequestFailedException.h`
* ✅ `ObjFW/OFHTTPRequest.h`
* ✅ `ObjFW/OFHTTPResponse.h`
* ✅ `ObjFW/OFHTTPServer.h`
* ✅ `ObjFW/OFInflate64Stream.h`
* ✅ `ObjFW/OFInflateStream.h`
* ✅ `ObjFW/OFINICategory.h`
* ✅ `ObjFW/OFINIFile.h`
* ✅ `ObjFW/OFInitializationFailedException.h`
* ✅ `ObjFW/OFInvalidArgumentException.h`
* ✅ `ObjFW/OFInvalidEncodingException.h`
* ✅ `ObjFW/OFInvalidFormatException.h`
* ✅ `ObjFW/OFInvalidJSONException.h`
* ✅ `ObjFW/OFInvalidServerResponseException.h`
* ✅ `ObjFW/OFInvocation.h`
* ✅ `ObjFW/OFIPXSocket.h`
* ✅ `ObjFW/OFJSONRepresentation.h`
* ✅ `ObjFW/OFKernelEventObserver.h`
* ✅ `ObjFW/OFKeyValueCoding.h`
* ✅ `ObjFW/OFLHAArchiveEntry.h`
* ✅ `ObjFW/OFLHAArchive.h`
* ✅ `ObjFW/OFLinkItemFailedException.h`
* ✅ `ObjFW/OFListenFailedException.h`
* ✅ `ObjFW/OFList.h`
* ✅ `ObjFW/OFLoadPluginFailedException.h`
* ✅ `ObjFW/OFLocale.h`
* ✅ `ObjFW/OFLockFailedException.h`
* ✅ `ObjFW/OFLocking.h`
* ✅ `ObjFW/OFMalformedXMLException.h`
* ✅ `ObjFW/OFMapTable.h`
* ✅ `ObjFW/OFMD5Hash.h`
* ✅ `ObjFW/OFMemoryStream.h`
* ✅ `ObjFW/OFMessagePackExtension.h`
* ✅ `ObjFW/OFMessagePackRepresentation.h`
* ✅ `ObjFW/OFMethodSignature.h`
* ✅ `ObjFW/OFMoveItemFailedException.h`
* ✅ `ObjFW/OFMutableArchiveEntry.h`
* ✅ `ObjFW/OFMutableArray.h`
* ✅ `ObjFW/OFMutableData.h`
* ✅ `ObjFW/OFMutableDictionary.h`
* ✅ `ObjFW/OFMutableLHAArchiveEntry.h`
* ✅ `ObjFW/OFMutablePair.h`
* ✅ `ObjFW/OFMutableSet.h`
* ✅ `ObjFW/OFMutableString.h`
* ✅ `ObjFW/OFMutableTarArchiveEntry.h`
* ✅ `ObjFW/OFMutableTriple.h`
* ✅ `ObjFW/OFMutableURI.h`
* ✅ `ObjFW/OFMutableZIPArchiveEntry.h`
* ✅ `ObjFW/OFMutex.h`
* ✅ `ObjFW/OFNotificationCenter.h`
* ✅ `ObjFW/OFNotification.h`
* ✅ `ObjFW/OFNotImplementedException.h`
* ✅ `ObjFW/OFNotOpenException.h`
* ✅ `ObjFW/OFNull.h`
* ✅ `ObjFW/OFNumber.h`
* ✅ `ObjFW/OFObject.h`
* ✅ `ObjFW/OFObject+KeyValueCoding.h`
* ✅ `ObjFW/OFObject+Serialization.h`
* ✅ `ObjFW/OFObserveKernelEventsFailedException.h`
* ✅ `ObjFW/OFOnce.h`
* ✅ `ObjFW/OFOpenItemFailedException.h`
* ✅ `ObjFW/OFOpenWindowsRegistryKeyFailedException.h`
* ✅ `ObjFW/OFOptionsParser.h`
* ✅ `ObjFW/OFOutOfMemoryException.h`
* ✅ `ObjFW/OFOutOfRangeException.h`
* ✅ `ObjFW/OFPair.h`
* ✅ `ObjFW/OFPBKDF2.h`
* ✅ `ObjFW/OFPlainCondition.h`
* ✅ `ObjFW/OFPlainMutex.h`
* ✅ `ObjFW/OFPlainThread.h`
* ✅ `ObjFW/OFPlugin.h`
* ✅ `ObjFW/OFReadFailedException.h`
* ✅ `ObjFW/OFReadOrWriteFailedException.h`
* ✅ `ObjFW/OFRecursiveMutex.h`
* ✅ `ObjFW/OFRemoveItemFailedException.h`
* ✅ `ObjFW/OFResolveHostFailedException.h`
* ✅ `ObjFW/OFRIPEMD160Hash.h`
* ✅ `ObjFW/OFRunLoop.h`
* ✅ `ObjFW/OFScrypt.h`
* ✅ `ObjFW/OFSecureData.h`
* ✅ `ObjFW/OFSeekableStream.h`
* ✅ `ObjFW/OFSeekFailedException.h`
* ✅ `ObjFW/OFSequencedPacketSocket.h`
* ✅ `ObjFW/OFSerialization.h`
* ✅ `ObjFW/OFSet.h`
* ✅ `ObjFW/OFSetItemAttributesFailedException.h`
* ✅ `ObjFW/OFSetOptionFailedException.h`
* ✅ `ObjFW/OFSetWindowsRegistryValueFailedException.h`
* ✅ `ObjFW/OFSettings.h`
* ✅ `ObjFW/OFSHA1Hash.h`
* ✅ `ObjFW/OFSHA224Hash.h`
* ✅ `ObjFW/OFSHA224Or256Hash.h`
* ✅ `ObjFW/OFSHA256Hash.h`
* ✅ `ObjFW/OFSHA384Hash.h`
* ✅ `ObjFW/OFSHA384Or512Hash.h`
* ✅ `ObjFW/OFSHA512Hash.h`
* ✅ `ObjFW/OFSocket.h`
* ✅ `ObjFW/OFSortedList.h`
* ✅ `ObjFW/OFSPXSocket.h`
* ✅ `ObjFW/OFSPXStreamSocket.h`
* ✅ `ObjFW/OFStdIOStream.h`
* ✅ `ObjFW/OFStillLockedException.h`
* ✅ `ObjFW/OFStream.h`
* ✅ `ObjFW/OFStreamSocket.h`
* ✅ `ObjFW/OFString+CryptographicHashing.h`
* ✅ `ObjFW/OFString.h`
* ✅ `ObjFW/OFString+JSONParsing.h`
* ✅ `ObjFW/OFString+PathAdditions.h`
* ✅ `ObjFW/OFString+PercentIEncoding.h`
* ✅ `ObjFW/OFString+PropertyListParsing.h`
* ✅ `ObjFW/OFString+Serialization.h`
* ✅ `ObjFW/OFString+XMLEscaping.h`
* ✅ `ObjFW/OFString+XMLUnescaping.h`
* ✅ `ObjFW/OFSubprocess.h`
* ✅ `ObjFW/OFSystemInfo.h`
* ✅ `ObjFW/OFTarArchiveEntry.h`
* ✅ `ObjFW/OFTarArchive.h`
* ✅ `ObjFW/OFTCPSocket.h`
* ✅ `ObjFW/OFThread.h`
* ✅ `ObjFW/OFThreadJoinFailedException.h`
* ✅ `ObjFW/OFThreadStartFailedException.h`
* ✅ `ObjFW/OFThreadStillRunningException.h`
* ✅ `ObjFW/OFTimer.h`
* ✅ `ObjFW/OFTLSHandshakeFailedException.h`
* ✅ `ObjFW/OFTLSKey.h`
* ✅ `ObjFW/OFTLSStream.h`
* ✅ `ObjFW/OFTriple.h`
* ✅ `ObjFW/OFTruncatedDataException.h`
* ✅ `ObjFW/OFUDPSocket.h`
* ✅ `ObjFW/OFUnboundNamespaceException.h`
* ✅ `ObjFW/OFUnboundPrefixException.h`
* ✅ `ObjFW/OFUndefinedKeyException.h`
* ✅ `ObjFW/OFUNIXDatagramSocket.h`
* ✅ `ObjFW/OFUNIXStreamSocket.h`
* ✅ `ObjFW/OFUnknownXMLEntityException.h`
* ✅ `ObjFW/OFUnlockFailedException.h`
* ✅ `ObjFW/OFUnsupportedProtocolException.h`
* ✅ `ObjFW/OFUnsupportedVersionException.h`
* ✅ `ObjFW/OFURI.h`
* ✅ `ObjFW/OFURIHandler.h`
* ✅ `ObjFW/OFUUID.h`
* ✅ `ObjFW/OFValue.h`
* ✅ `ObjFW/OFWindowsRegistryKey.h`
* ✅ `ObjFW/OFWriteFailedException.h`
* ✅ `ObjFW/OFXMLAttribute.h`
* ✅ `ObjFW/OFXMLCDATA.h`
* ✅ `ObjFW/OFXMLCharacters.h`
* ✅ `ObjFW/OFXMLComment.h`
* ✅ `ObjFW/OFXMLElementBuilder.h`
* ✅ `ObjFW/OFXMLElement.h`
* ✅ `ObjFW/OFXMLElement+Serialization.h`
* ✅ `ObjFW/OFXMLNode.h`
* ✅ `ObjFW/OFXMLParser.h`
* ✅ `ObjFW/OFXMLProcessingInstruction.h`
* ✅ `ObjFW/OFZIPArchiveEntry.h`
* ✅ `ObjFW/OFZIPArchive.h`
* ✅
* ✅
* ✅ `ObjFW/platform.h`
* ✅
* ✅
* ✅
* ✅ `ObjFWRT/ObjFWRT.h`
* ✅ `ObjFWTLS/ObjFWTLS.h`

Some things still need to be checked on a global level:

* ✅ Classes that already reserve ivars need to be considered to be changed to restricted subclassing
* ✅ All classes either restrict subclassing or reserve ivars
* ❌ All exception throws need to be audited (they're part of the API, too!)
  * ✅ OFASPrintF.m
  * ✅ OFAdjacentArray.m
  * ✅ OFApplication.m
  * ✅ OFArray.m
  * ✅ OFBitSetCharacterSet.m
  * ✅ OFBlock.m
  * ✅ OFBytesValue.m
  * ✅ OFColor.m
  * ✅ OFCondition.m
  * ✅ OFConstantString.m
  * ✅ OFCountedMapTableSet.m
  * ✅ OFDNSResolver.m
  * ✅ OFDNSResolverSettings.m
  * ✅ OFDNSResourceRecord.m
  * ✅ OFData+MessagePackParsing.m
  * ✅ OFData.m
  * ✅ OFDatagramSocket.m
  * ✅ OFDate.m
  * ✅ OFDictionary.m
  * ✅ OFEmbeddedURIHandler.m
  * ✅ OFEpollKernelEventObserver.m
  * ✅ OFFile.m
  * ✅ OFFileManager.m
  * ✅ OFFileURIHandler.m
  * ✅ OFGZIPStream.m
  * ✅ OFHMAC.m
  * ✅ OFHTTPClient.m
  * ✅ OFHTTPCookie.m
  * ✅ OFHTTPRequest.m
  * ✅ OFHTTPResponse.m
  * ✅ OFHTTPServer.m
  * ✅ OFHostAddressResolver.m
  * ✅ OFHuffmanTree.h
  * ✅ OFINICategory.m
  * ✅ OFINIFile.m
  * ✅ OFIPXSocket.m
  * ✅ OFInflateStream.m
  * ✅ OFKernelEventObserver.m
  * ✅ OFKqueueKernelEventObserver.m
  * ✅ OFLHAArchive.m
  * ✅ OFLHAArchiveEntry.m
  * ✅ OFLHADecompressingStream.m
  * ✅ OFList.m
  * ✅ OFLocale.m
  * ✅ OFMD5Hash.m
  * ✅ OFMapTable.m
  * ✅ OFMapTableDictionary.m
  * ✅ OFMapTableSet.m
  * ✅ OFMemoryStream.m
  * ✅ OFMessagePackExtension.m
  * ✅ OFMethodSignature.m
  * ✅ OFMutableAdjacentArray.m
  * ✅ OFMutableArray.m
  * ✅ OFMutableData.m
  * ✅ OFMutableMapTableDictionary.m
  * ✅ OFMutableString.m
  * ✅ OFMutableURI.m
  * ✅ OFMutableUTF8String.m
  * ✅ OFMutableZIPArchiveEntry.m
  * ✅ OFMutex.m
  * ✅ OFNonretainedObjectValue.m
  * ✅ OFNotificationCenter.m
  * ✅ OFNull.m
  * ✅ OFNumber.m
  * ✅ OFObject+KeyValueCoding.m
  * ✅ OFObject.m
  * ✅ OFOptionsParser.m
  * ✅ OFPBKDF2.m
  * ✅ OFPlugin.m
  * ✅ OFPointValue.m
  * ✅ OFPointerValue.m
  * ✅ OFPollKernelEventObserver.m
  * ✅ OFRIPEMD160Hash.m
  * ✅ OFRangeCharacterSet.m
  * ✅ OFRangeValue.m
  * ✅ OFRectValue.m
  * ✅ OFRecursiveMutex.m
  * ✅ OFSHA1Hash.m
  * ✅ OFSHA224Or256Hash.m
  * ✅ OFSHA384Or512Hash.m
  * ✅ OFSPXSocket.m
  * ✅ OFSPXStreamSocket.m
  * ✅ OFScrypt.m
  * ✅ OFSecureData.m
  * ✅ OFSelectKernelEventObserver.m
  * ✅ OFSequencedPacketSocket.m
  * ✅ OFSizeValue.m
  * ✅ OFSocket.m
  * ✅ OFStdIOStream.m
  * ❌ OFStream.m
  * ❌ OFStreamSocket.m
  * ❌ OFString+JSONParsing.m
  * ❌ OFString+PercentEncoding.m
  * ❌ OFString+PropertyListParsing.m
  * ❌ OFString+Serialization.m
  * ❌ OFString+XMLUnescaping.m
  * ❌ OFString.m
  * ✅ OFSubarray.m
  * ❌ OFTCPSocket.m
  * ✅ OFTLSStream.m
  * ❌ OFTarArchive.m
  * ❌ OFTarArchiveEntry.m
  * ❌ OFThread.m
  * ✅ OFTimer.m
  * ❌ OFUDPSocket.m
  * ❌ OFUNIXDatagramSocket.m
  * ❌ OFUNIXStreamSocket.m
  * ✅ OFURI.m
  * ✅ OFURIHandler.m
  * ❌ OFUTF8String.m
  * ✅ OFUUID.m
  * ❌ OFWindowsRegistryKey.m
  * ✅ OFXMLAttribute.m
  * ✅ OFXMLCDATA.m
  * ✅ OFXMLCharacters.m
  * ✅ OFXMLComment.m
  * ❌ OFXMLElement+Serialization.m
  * ❌ OFXMLElement.m
  * ❌ OFXMLElementBuilder.m
  * ❌ OFXMLParser.m
  * ✅ OFXMLProcessingInstruction.m
  * ❌ OFZIPArchive.m
  * ❌ OFZIPArchiveEntry.m
  * ✅ bridge/NSNumber+OFObject.m
  * ✅ bridge/NSOFArray.m
  * ✅ bridge/NSOFDictionary.m
  * ✅ bridge/NSOFSet.m
  * ✅ bridge/OFException+Swift.m
  * ✅ bridge/OFNSArray.m
  * ✅ bridge/OFNSDictionary.m
  * ✅ bridge/OFNSEnumerator.m
  * ✅ bridge/OFNSSet.m
  * ✅ bridge/OFNumber+NSObject.m
  * ✅ bridge/OFString+NSObject.m
  * ✅ exceptions/OFException.m
  * ✅ libbases.m
  * ❌
  * ❌
  * ❌
  * ❌
  * ✅
  * ❌
  * ❌ tls/OFGnuTLSTLSStream.m
  * ❌ tls/OFOpenSSLTLSStream.m
  * ❌ tls/OFSecureTransportTLSStream.m