Core Foundation (also called CF) is a C application programming interface (API) in macOS & iOS, and is a mix of low-level routines and wrapper functions. Apple releases most of it as an open-source project called CFLite that can be used to write cross-platform applications for macOS, Linux, and Windows. A third-party open-source implementation called OpenCFLite also exists which extends the Apple distribution for building on Windows and Linux environments. Most Core Foundation routines follow a certain naming convention that deal with opaque objects, for example CFDictionaryRef for functions whose names begin with CFDictionary, and these objects are often reference counted (manually) through
CFRelease. Internally, Core Foundation forms the base of the types in the Objective-C standard library as well.
The most prevalent use of Core Foundation is for passing its own primitive types for data, including raw bytes, Unicode strings, numbers, calendar dates, and UUIDs, as well as collections such as arrays, sets, and dictionaries, to numerous macOS C routines, primarily those that are GUI-related. At the operating system level Core Foundation also provides standardized application preferences management through
CFPropertyList, bundle handling, run loops, interprocess communication through
CFNotificationCenter, and a basic graphical user interface message dialog through
Other parts of the API include utility routines and wrappers around existing APIs for ease of use. Utility routines perform such actions as file system and network I/O through
CFURL and endianness translation (Byte Order Utilities). Some examples of wrapper routines include those for Core Foundation's wrapper routines for Unix sockets, the CFSocket API.
Some types in Core Foundation are "toll-free bridged", or interchangeable with a simple cast, with those of their Foundation Kit counterparts. For example, one could create a
CFDictionaryRef Core Foundation type, and then later simply use a standard C cast to convert it to its Objective-C counterpart,
NSDictionary *, and then use the desired Objective-C methods on that object as one normally would.