| 1 | /* |
| 2 | * Copyright (c) 1999-2007 Apple Inc. All Rights Reserved. |
| 3 | * |
| 4 | * @APPLE_LICENSE_HEADER_START@ |
| 5 | * |
| 6 | * This file contains Original Code and/or Modifications of Original Code |
| 7 | * as defined in and that are subject to the Apple Public Source License |
| 8 | * Version 2.0 (the 'License'). You may not use this file except in |
| 9 | * compliance with the License. Please obtain a copy of the License at |
| 10 | * http://www.opensource.apple.com/apsl/ and read it before using this |
| 11 | * file. |
| 12 | * |
| 13 | * The Original Code and all software distributed under the License are |
| 14 | * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER |
| 15 | * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, |
| 16 | * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, |
| 17 | * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. |
| 18 | * Please see the License for the specific language governing rights and |
| 19 | * limitations under the License. |
| 20 | * |
| 21 | * @APPLE_LICENSE_HEADER_END@ |
| 22 | */ |
| 23 | |
| 24 | #ifndef _OBJC_RUNTIME_H |
| 25 | #define _OBJC_RUNTIME_H |
| 26 | |
| 27 | #include <objc/objc.h> |
| 28 | #include <stdarg.h> |
| 29 | #include <stdint.h> |
| 30 | #include <stddef.h> |
| 31 | #include <Availability.h> |
| 32 | #include <TargetConditionals.h> |
| 33 | |
| 34 | #if TARGET_OS_MAC |
| 35 | #include <stdlib.h> |
| 36 | #endif |
| 37 | |
| 38 | |
| 39 | /* Types */ |
| 40 | |
| 41 | #if !OBJC_TYPES_DEFINED |
| 42 | |
| 43 | /// An opaque type that represents a method in a class definition. |
| 44 | typedef struct objc_method *Method; |
| 45 | |
| 46 | /// An opaque type that represents an instance variable. |
| 47 | typedef struct objc_ivar *Ivar; |
| 48 | |
| 49 | /// An opaque type that represents a category. |
| 50 | typedef struct objc_category *Category; |
| 51 | |
| 52 | /// An opaque type that represents an Objective-C declared property. |
| 53 | typedef struct objc_property *objc_property_t; |
| 54 | |
| 55 | #endif |
| 56 | |
| 57 | /// Defines a method |
| 58 | struct objc_method_description { |
| 59 | SEL _Nullable name; /**< The name of the method */ |
| 60 | char * _Nullable types; /**< The types of the method arguments */ |
| 61 | }; |
| 62 | |
| 63 | /// Defines a property attribute |
| 64 | typedef struct { |
| 65 | const char * _Nonnull name; /**< The name of the attribute */ |
| 66 | const char * _Nonnull value; /**< The value of the attribute (usually empty) */ |
| 67 | } objc_property_attribute_t; |
| 68 | |
| 69 | // Used by objc_func_loadImage |
| 70 | struct mach_header; |
| 71 | |
| 72 | /* Functions */ |
| 73 | |
| 74 | /* Working with Instances */ |
| 75 | |
| 76 | /** |
| 77 | * Returns a copy of a given object. |
| 78 | * |
| 79 | * @param obj An Objective-C object. |
| 80 | * @param size The size of the object \e obj. |
| 81 | * |
| 82 | * @return A copy of \e obj. |
| 83 | */ |
| 84 | OBJC_EXPORT id _Nullable object_copy(id _Nullable obj, size_t size) |
| 85 | OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0) |
| 86 | OBJC_ARC_UNAVAILABLE; |
| 87 | |
| 88 | /** |
| 89 | * Frees the memory occupied by a given object. |
| 90 | * |
| 91 | * @param obj An Objective-C object. |
| 92 | * |
| 93 | * @return nil |
| 94 | */ |
| 95 | OBJC_EXPORT id _Nullable |
| 96 | object_dispose(id _Nullable obj) |
| 97 | OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0) |
| 98 | OBJC_ARC_UNAVAILABLE; |
| 99 | |
| 100 | /** |
| 101 | * Returns the class of an object. |
| 102 | * |
| 103 | * @param obj The object you want to inspect. |
| 104 | * |
| 105 | * @return The class object of which \e object is an instance, |
| 106 | * or \c Nil if \e object is \c nil. |
| 107 | */ |
| 108 | OBJC_EXPORT Class _Nullable |
| 109 | object_getClass(id _Nullable obj) |
| 110 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 111 | |
| 112 | /** |
| 113 | * Sets the class of an object. |
| 114 | * |
| 115 | * @param obj The object to modify. |
| 116 | * @param cls A class object. |
| 117 | * |
| 118 | * @return The previous value of \e object's class, or \c Nil if \e object is \c nil. |
| 119 | */ |
| 120 | OBJC_EXPORT Class _Nullable |
| 121 | object_setClass(id _Nullable obj, Class _Nonnull cls) |
| 122 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 123 | |
| 124 | |
| 125 | /** |
| 126 | * Returns whether an object is a class object. |
| 127 | * |
| 128 | * @param obj An Objective-C object. |
| 129 | * |
| 130 | * @return true if the object is a class or metaclass, false otherwise. |
| 131 | */ |
| 132 | OBJC_EXPORT BOOL |
| 133 | object_isClass(id _Nullable obj) |
| 134 | OBJC_AVAILABLE(10.10, 8.0, 9.0, 1.0, 2.0); |
| 135 | |
| 136 | |
| 137 | /** |
| 138 | * Reads the value of an instance variable in an object. |
| 139 | * |
| 140 | * @param obj The object containing the instance variable whose value you want to read. |
| 141 | * @param ivar The Ivar describing the instance variable whose value you want to read. |
| 142 | * |
| 143 | * @return The value of the instance variable specified by \e ivar, or \c nil if \e object is \c nil. |
| 144 | * |
| 145 | * @note \c object_getIvar is faster than \c object_getInstanceVariable if the Ivar |
| 146 | * for the instance variable is already known. |
| 147 | */ |
| 148 | OBJC_EXPORT id _Nullable |
| 149 | object_getIvar(id _Nullable obj, Ivar _Nonnull ivar) |
| 150 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 151 | |
| 152 | /** |
| 153 | * Sets the value of an instance variable in an object. |
| 154 | * |
| 155 | * @param obj The object containing the instance variable whose value you want to set. |
| 156 | * @param ivar The Ivar describing the instance variable whose value you want to set. |
| 157 | * @param value The new value for the instance variable. |
| 158 | * |
| 159 | * @note Instance variables with known memory management (such as ARC strong and weak) |
| 160 | * use that memory management. Instance variables with unknown memory management |
| 161 | * are assigned as if they were unsafe_unretained. |
| 162 | * @note \c object_setIvar is faster than \c object_setInstanceVariable if the Ivar |
| 163 | * for the instance variable is already known. |
| 164 | */ |
| 165 | OBJC_EXPORT void |
| 166 | object_setIvar(id _Nullable obj, Ivar _Nonnull ivar, id _Nullable value) |
| 167 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 168 | |
| 169 | /** |
| 170 | * Sets the value of an instance variable in an object. |
| 171 | * |
| 172 | * @param obj The object containing the instance variable whose value you want to set. |
| 173 | * @param ivar The Ivar describing the instance variable whose value you want to set. |
| 174 | * @param value The new value for the instance variable. |
| 175 | * |
| 176 | * @note Instance variables with known memory management (such as ARC strong and weak) |
| 177 | * use that memory management. Instance variables with unknown memory management |
| 178 | * are assigned as if they were strong. |
| 179 | * @note \c object_setIvar is faster than \c object_setInstanceVariable if the Ivar |
| 180 | * for the instance variable is already known. |
| 181 | */ |
| 182 | OBJC_EXPORT void |
| 183 | object_setIvarWithStrongDefault(id _Nullable obj, Ivar _Nonnull ivar, |
| 184 | id _Nullable value) |
| 185 | OBJC_AVAILABLE(10.12, 10.0, 10.0, 3.0, 2.0); |
| 186 | |
| 187 | /** |
| 188 | * Changes the value of an instance variable of a class instance. |
| 189 | * |
| 190 | * @param obj A pointer to an instance of a class. Pass the object containing |
| 191 | * the instance variable whose value you wish to modify. |
| 192 | * @param name A C string. Pass the name of the instance variable whose value you wish to modify. |
| 193 | * @param value The new value for the instance variable. |
| 194 | * |
| 195 | * @return A pointer to the \c Ivar data structure that defines the type and |
| 196 | * name of the instance variable specified by \e name. |
| 197 | * |
| 198 | * @note Instance variables with known memory management (such as ARC strong and weak) |
| 199 | * use that memory management. Instance variables with unknown memory management |
| 200 | * are assigned as if they were unsafe_unretained. |
| 201 | */ |
| 202 | OBJC_EXPORT Ivar _Nullable |
| 203 | object_setInstanceVariable(id _Nullable obj, const char * _Nonnull name, |
| 204 | void * _Nullable value) |
| 205 | OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0) |
| 206 | OBJC_ARC_UNAVAILABLE; |
| 207 | |
| 208 | /** |
| 209 | * Changes the value of an instance variable of a class instance. |
| 210 | * |
| 211 | * @param obj A pointer to an instance of a class. Pass the object containing |
| 212 | * the instance variable whose value you wish to modify. |
| 213 | * @param name A C string. Pass the name of the instance variable whose value you wish to modify. |
| 214 | * @param value The new value for the instance variable. |
| 215 | * |
| 216 | * @return A pointer to the \c Ivar data structure that defines the type and |
| 217 | * name of the instance variable specified by \e name. |
| 218 | * |
| 219 | * @note Instance variables with known memory management (such as ARC strong and weak) |
| 220 | * use that memory management. Instance variables with unknown memory management |
| 221 | * are assigned as if they were strong. |
| 222 | */ |
| 223 | OBJC_EXPORT Ivar _Nullable |
| 224 | object_setInstanceVariableWithStrongDefault(id _Nullable obj, |
| 225 | const char * _Nonnull name, |
| 226 | void * _Nullable value) |
| 227 | OBJC_AVAILABLE(10.12, 10.0, 10.0, 3.0, 2.0) |
| 228 | OBJC_ARC_UNAVAILABLE; |
| 229 | |
| 230 | /** |
| 231 | * Obtains the value of an instance variable of a class instance. |
| 232 | * |
| 233 | * @param obj A pointer to an instance of a class. Pass the object containing |
| 234 | * the instance variable whose value you wish to obtain. |
| 235 | * @param name A C string. Pass the name of the instance variable whose value you wish to obtain. |
| 236 | * @param outValue On return, contains a pointer to the value of the instance variable. |
| 237 | * |
| 238 | * @return A pointer to the \c Ivar data structure that defines the type and name of |
| 239 | * the instance variable specified by \e name. |
| 240 | */ |
| 241 | OBJC_EXPORT Ivar _Nullable |
| 242 | object_getInstanceVariable(id _Nullable obj, const char * _Nonnull name, |
| 243 | void * _Nullable * _Nullable outValue) |
| 244 | OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0) |
| 245 | OBJC_ARC_UNAVAILABLE; |
| 246 | |
| 247 | |
| 248 | /* Obtaining Class Definitions */ |
| 249 | |
| 250 | /** |
| 251 | * Returns the class definition of a specified class. |
| 252 | * |
| 253 | * @param name The name of the class to look up. |
| 254 | * |
| 255 | * @return The Class object for the named class, or \c nil |
| 256 | * if the class is not registered with the Objective-C runtime. |
| 257 | * |
| 258 | * @note The implementation of \c objc_getClass is identical to the implementation |
| 259 | * of \c objc_lookUpClass. |
| 260 | */ |
| 261 | OBJC_EXPORT Class _Nullable |
| 262 | objc_getClass(const char * _Nonnull name) |
| 263 | OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0); |
| 264 | |
| 265 | /** |
| 266 | * Returns the metaclass definition of a specified class. |
| 267 | * |
| 268 | * @param name The name of the class to look up. |
| 269 | * |
| 270 | * @return The \c Class object for the metaclass of the named class, or \c nil if the class |
| 271 | * is not registered with the Objective-C runtime. |
| 272 | * |
| 273 | * @note If the definition for the named class is not registered, this function calls the class handler |
| 274 | * callback and then checks a second time to see if the class is registered. However, every class |
| 275 | * definition must have a valid metaclass definition, and so the metaclass definition is always returned, |
| 276 | * whether it’s valid or not. |
| 277 | */ |
| 278 | OBJC_EXPORT Class _Nullable |
| 279 | objc_getMetaClass(const char * _Nonnull name) |
| 280 | OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0); |
| 281 | |
| 282 | /** |
| 283 | * Returns the class definition of a specified class. |
| 284 | * |
| 285 | * @param name The name of the class to look up. |
| 286 | * |
| 287 | * @return The Class object for the named class, or \c nil if the class |
| 288 | * is not registered with the Objective-C runtime. |
| 289 | * |
| 290 | * @note The implementation of \c objc_lookUpClass is identical to the implementation |
| 291 | * of \c objc_getClass. |
| 292 | */ |
| 293 | OBJC_EXPORT Class _Nullable |
| 294 | objc_lookUpClass(const char * _Nonnull name) |
| 295 | OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0); |
| 296 | |
| 297 | /** |
| 298 | * Returns the class definition of a specified class. |
| 299 | * |
| 300 | * @param name The name of the class to look up. |
| 301 | * |
| 302 | * @return The Class object for the named class. |
| 303 | * |
| 304 | * @note This function is the same as \c objc_getClass, but kills the process if the class is not found. |
| 305 | */ |
| 306 | OBJC_EXPORT Class _Nonnull |
| 307 | objc_getRequiredClass(const char * _Nonnull name) |
| 308 | OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0); |
| 309 | |
| 310 | /** |
| 311 | * Obtains the list of registered class definitions. |
| 312 | * |
| 313 | * @param buffer An array of \c Class values. On output, each \c Class value points to |
| 314 | * one class definition, up to either \e bufferCount or the total number of registered classes, |
| 315 | * whichever is less. You can pass \c NULL to obtain the total number of registered class |
| 316 | * definitions without actually retrieving any class definitions. |
| 317 | * @param bufferCount An integer value. Pass the number of pointers for which you have allocated space |
| 318 | * in \e buffer. On return, this function fills in only this number of elements. If this number is less |
| 319 | * than the number of registered classes, this function returns an arbitrary subset of the registered classes. |
| 320 | * |
| 321 | * @return An integer value indicating the total number of registered classes. |
| 322 | * |
| 323 | * @note The Objective-C runtime library automatically registers all the classes defined in your source code. |
| 324 | * You can create class definitions at runtime and register them with the \c objc_addClass function. |
| 325 | * |
| 326 | * @warning You cannot assume that class objects you get from this function are classes that inherit from \c NSObject, |
| 327 | * so you cannot safely call any methods on such classes without detecting that the method is implemented first. |
| 328 | */ |
| 329 | OBJC_EXPORT int |
| 330 | objc_getClassList(Class _Nonnull * _Nullable buffer, int bufferCount) |
| 331 | OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0); |
| 332 | |
| 333 | /** |
| 334 | * Creates and returns a list of pointers to all registered class definitions. |
| 335 | * |
| 336 | * @param outCount An integer pointer used to store the number of classes returned by |
| 337 | * this function in the list. It can be \c nil. |
| 338 | * |
| 339 | * @return A nil terminated array of classes. It must be freed with \c free(). |
| 340 | * |
| 341 | * @see objc_getClassList |
| 342 | */ |
| 343 | OBJC_EXPORT Class _Nonnull * _Nullable |
| 344 | objc_copyClassList(unsigned int * _Nullable outCount) |
| 345 | OBJC_AVAILABLE(10.7, 3.1, 9.0, 1.0, 2.0); |
| 346 | |
| 347 | /** |
| 348 | * Enumerates classes, filtering by image, name, protocol conformance and superclass. |
| 349 | * |
| 350 | * @param image The image to search. Can be NULL (search the caller's image), |
| 351 | * OBJC_DYNAMIC_CLASSES (search dynamically registered classes), |
| 352 | * a handle returned by dlopen(3), or the Mach header of an image |
| 353 | * loaded into the current process. |
| 354 | * @param namePrefix If non-NULL, a required prefix for the class name. |
| 355 | * @param conformingTo If non-NULL, a protocol to which the enumerated classes |
| 356 | * must conform. |
| 357 | * @param subclassing If non-NULL, a class which the enumerated classes must |
| 358 | * subclass. |
| 359 | * @param block A block that is called for each matching class. Can abort |
| 360 | * enumeration by setting *stop to YES. |
| 361 | * |
| 362 | */ |
| 363 | #define OBJC_DYNAMIC_CLASSES ((const void *)-1) |
| 364 | #ifdef __BLOCKS__ |
| 365 | OBJC_EXPORT void |
| 366 | objc_enumerateClasses(const void * _Nullable image, |
| 367 | const char * _Nullable namePrefix, |
| 368 | Protocol * _Nullable conformingTo, |
| 369 | Class _Nullable subclassing, |
| 370 | void (^ _Nonnull block)(Class _Nonnull aClass, BOOL * _Nonnull stop) |
| 371 | OBJC_NOESCAPE) |
| 372 | OBJC_AVAILABLE(13.0, 16.0, 16.0, 9.0, 7.0) |
| 373 | OBJC_REFINED_FOR_SWIFT |
| 374 | OBJC_NOT_TAIL_CALLED; |
| 375 | #endif |
| 376 | |
| 377 | /* Working with Classes */ |
| 378 | |
| 379 | /** |
| 380 | * Returns the name of a class. |
| 381 | * |
| 382 | * @param cls A class object. |
| 383 | * |
| 384 | * @return The name of the class, or the empty string if \e cls is \c Nil. |
| 385 | */ |
| 386 | OBJC_EXPORT const char * _Nonnull |
| 387 | class_getName(Class _Nullable cls) |
| 388 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 389 | |
| 390 | /** |
| 391 | * Returns a Boolean value that indicates whether a class object is a metaclass. |
| 392 | * |
| 393 | * @param cls A class object. |
| 394 | * |
| 395 | * @return \c YES if \e cls is a metaclass, \c NO if \e cls is a non-meta class, |
| 396 | * \c NO if \e cls is \c Nil. |
| 397 | */ |
| 398 | OBJC_EXPORT BOOL |
| 399 | class_isMetaClass(Class _Nullable cls) |
| 400 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 401 | |
| 402 | /** |
| 403 | * Returns the superclass of a class. |
| 404 | * |
| 405 | * @param cls A class object. |
| 406 | * |
| 407 | * @return The superclass of the class, or \c Nil if |
| 408 | * \e cls is a root class, or \c Nil if \e cls is \c Nil. |
| 409 | * |
| 410 | * @note You should usually use \c NSObject's \c superclass method instead of this function. |
| 411 | */ |
| 412 | OBJC_EXPORT Class _Nullable |
| 413 | class_getSuperclass(Class _Nullable cls) |
| 414 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 415 | |
| 416 | /** |
| 417 | * Sets the superclass of a given class. |
| 418 | * |
| 419 | * @param cls The class whose superclass you want to set. |
| 420 | * @param newSuper The new superclass for cls. |
| 421 | * |
| 422 | * @return The old superclass for cls. |
| 423 | * |
| 424 | * @warning You should not use this function. |
| 425 | */ |
| 426 | OBJC_EXPORT Class _Nonnull |
| 427 | class_setSuperclass(Class _Nonnull cls, Class _Nonnull newSuper) |
| 428 | __OSX_DEPRECATED(10.5, 10.5, "not recommended") |
| 429 | __IOS_DEPRECATED(2.0, 2.0, "not recommended") |
| 430 | __TVOS_DEPRECATED(9.0, 9.0, "not recommended") |
| 431 | __WATCHOS_DEPRECATED(1.0, 1.0, "not recommended") |
| 432 | |
| 433 | ; |
| 434 | |
| 435 | /** |
| 436 | * Returns the version number of a class definition. |
| 437 | * |
| 438 | * @param cls A pointer to a \c Class data structure. Pass |
| 439 | * the class definition for which you wish to obtain the version. |
| 440 | * |
| 441 | * @return An integer indicating the version number of the class definition. |
| 442 | * |
| 443 | * @see class_setVersion |
| 444 | */ |
| 445 | OBJC_EXPORT int |
| 446 | class_getVersion(Class _Nullable cls) |
| 447 | OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0); |
| 448 | |
| 449 | /** |
| 450 | * Sets the version number of a class definition. |
| 451 | * |
| 452 | * @param cls A pointer to an Class data structure. |
| 453 | * Pass the class definition for which you wish to set the version. |
| 454 | * @param version An integer. Pass the new version number of the class definition. |
| 455 | * |
| 456 | * @note You can use the version number of the class definition to provide versioning of the |
| 457 | * interface that your class represents to other classes. This is especially useful for object |
| 458 | * serialization (that is, archiving of the object in a flattened form), where it is important to |
| 459 | * recognize changes to the layout of the instance variables in different class-definition versions. |
| 460 | * @note Classes derived from the Foundation framework \c NSObject class can set the class-definition |
| 461 | * version number using the \c setVersion: class method, which is implemented using the \c class_setVersion function. |
| 462 | */ |
| 463 | OBJC_EXPORT void |
| 464 | class_setVersion(Class _Nullable cls, int version) |
| 465 | OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0); |
| 466 | |
| 467 | /** |
| 468 | * Returns the size of instances of a class. |
| 469 | * |
| 470 | * @param cls A class object. |
| 471 | * |
| 472 | * @return The size in bytes of instances of the class \e cls, or \c 0 if \e cls is \c Nil. |
| 473 | */ |
| 474 | OBJC_EXPORT size_t |
| 475 | class_getInstanceSize(Class _Nullable cls) |
| 476 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 477 | |
| 478 | /** |
| 479 | * Returns the \c Ivar for a specified instance variable of a given class. |
| 480 | * |
| 481 | * @param cls The class whose instance variable you wish to obtain. |
| 482 | * @param name The name of the instance variable definition to obtain. |
| 483 | * |
| 484 | * @return A pointer to an \c Ivar data structure containing information about |
| 485 | * the instance variable specified by \e name. |
| 486 | */ |
| 487 | OBJC_EXPORT Ivar _Nullable |
| 488 | class_getInstanceVariable(Class _Nullable cls, const char * _Nonnull name) |
| 489 | OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0); |
| 490 | |
| 491 | /** |
| 492 | * Returns the Ivar for a specified class variable of a given class. |
| 493 | * |
| 494 | * @param cls The class definition whose class variable you wish to obtain. |
| 495 | * @param name The name of the class variable definition to obtain. |
| 496 | * |
| 497 | * @return A pointer to an \c Ivar data structure containing information about the class variable specified by \e name. |
| 498 | */ |
| 499 | OBJC_EXPORT Ivar _Nullable |
| 500 | class_getClassVariable(Class _Nullable cls, const char * _Nonnull name) |
| 501 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 502 | |
| 503 | /** |
| 504 | * Describes the instance variables declared by a class. |
| 505 | * |
| 506 | * @param cls The class to inspect. |
| 507 | * @param outCount On return, contains the length of the returned array. |
| 508 | * If outCount is NULL, the length is not returned. |
| 509 | * |
| 510 | * @return An array of pointers of type Ivar describing the instance variables declared by the class. |
| 511 | * Any instance variables declared by superclasses are not included. The array contains *outCount |
| 512 | * pointers followed by a NULL terminator. You must free the array with free(). |
| 513 | * |
| 514 | * If the class declares no instance variables, or cls is Nil, NULL is returned and *outCount is 0. |
| 515 | */ |
| 516 | OBJC_EXPORT Ivar _Nonnull * _Nullable |
| 517 | class_copyIvarList(Class _Nullable cls, unsigned int * _Nullable outCount) |
| 518 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 519 | |
| 520 | /** |
| 521 | * Returns a specified instance method for a given class. |
| 522 | * |
| 523 | * @param cls The class you want to inspect. |
| 524 | * @param name The selector of the method you want to retrieve. |
| 525 | * |
| 526 | * @return The method that corresponds to the implementation of the selector specified by |
| 527 | * \e name for the class specified by \e cls, or \c NULL if the specified class or its |
| 528 | * superclasses do not contain an instance method with the specified selector. |
| 529 | * |
| 530 | * @note This function searches superclasses for implementations, whereas \c class_copyMethodList does not. |
| 531 | */ |
| 532 | OBJC_EXPORT Method _Nullable |
| 533 | class_getInstanceMethod(Class _Nullable cls, SEL _Nonnull name) |
| 534 | OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0); |
| 535 | |
| 536 | /** |
| 537 | * Returns a pointer to the data structure describing a given class method for a given class. |
| 538 | * |
| 539 | * @param cls A pointer to a class definition. Pass the class that contains the method you want to retrieve. |
| 540 | * @param name A pointer of type \c SEL. Pass the selector of the method you want to retrieve. |
| 541 | * |
| 542 | * @return A pointer to the \c Method data structure that corresponds to the implementation of the |
| 543 | * selector specified by aSelector for the class specified by aClass, or NULL if the specified |
| 544 | * class or its superclasses do not contain a class method with the specified selector. |
| 545 | * |
| 546 | * @note Note that this function searches superclasses for implementations, |
| 547 | * whereas \c class_copyMethodList does not. |
| 548 | */ |
| 549 | OBJC_EXPORT Method _Nullable |
| 550 | class_getClassMethod(Class _Nullable cls, SEL _Nonnull name) |
| 551 | OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0); |
| 552 | |
| 553 | /** |
| 554 | * Returns the function pointer that would be called if a |
| 555 | * particular message were sent to an instance of a class. |
| 556 | * |
| 557 | * @param cls The class you want to inspect. |
| 558 | * @param name A selector. |
| 559 | * |
| 560 | * @return The function pointer that would be called if \c [object name] were called |
| 561 | * with an instance of the class, or \c NULL if \e cls is \c Nil. |
| 562 | * |
| 563 | * @note \c class_getMethodImplementation may be faster than \c method_getImplementation(class_getInstanceMethod(cls, name)). |
| 564 | * @note The function pointer returned may be a function internal to the runtime instead of |
| 565 | * an actual method implementation. For example, if instances of the class do not respond to |
| 566 | * the selector, the function pointer returned will be part of the runtime's message forwarding machinery. |
| 567 | */ |
| 568 | OBJC_EXPORT IMP _Nullable |
| 569 | class_getMethodImplementation(Class _Nullable cls, SEL _Nonnull name) |
| 570 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 571 | |
| 572 | /** |
| 573 | * Returns the function pointer that would be called if a particular |
| 574 | * message were sent to an instance of a class. |
| 575 | * |
| 576 | * @param cls The class you want to inspect. |
| 577 | * @param name A selector. |
| 578 | * |
| 579 | * @return The function pointer that would be called if \c [object name] were called |
| 580 | * with an instance of the class, or \c NULL if \e cls is \c Nil. |
| 581 | */ |
| 582 | OBJC_EXPORT IMP _Nullable |
| 583 | class_getMethodImplementation_stret(Class _Nullable cls, SEL _Nonnull name) |
| 584 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0) |
| 585 | OBJC_ARM64_UNAVAILABLE; |
| 586 | |
| 587 | /** |
| 588 | * Returns a Boolean value that indicates whether instances of a class respond to a particular selector. |
| 589 | * |
| 590 | * @param cls The class you want to inspect. |
| 591 | * @param sel A selector. |
| 592 | * |
| 593 | * @return \c YES if instances of the class respond to the selector, otherwise \c NO. |
| 594 | * |
| 595 | * @note You should usually use \c NSObject's \c respondsToSelector: or \c instancesRespondToSelector: |
| 596 | * methods instead of this function. |
| 597 | */ |
| 598 | OBJC_EXPORT BOOL |
| 599 | class_respondsToSelector(Class _Nullable cls, SEL _Nonnull sel) |
| 600 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 601 | |
| 602 | /** |
| 603 | * Describes the instance methods implemented by a class. |
| 604 | * |
| 605 | * @param cls The class you want to inspect. |
| 606 | * @param outCount On return, contains the length of the returned array. |
| 607 | * If outCount is NULL, the length is not returned. |
| 608 | * |
| 609 | * @return An array of pointers of type Method describing the instance methods |
| 610 | * implemented by the class—any instance methods implemented by superclasses are not included. |
| 611 | * The array contains *outCount pointers followed by a NULL terminator. You must free the array with free(). |
| 612 | * |
| 613 | * If cls implements no instance methods, or cls is Nil, returns NULL and *outCount is 0. |
| 614 | * |
| 615 | * @note To get the class methods of a class, use \c class_copyMethodList(object_getClass(cls), &count). |
| 616 | * @note To get the implementations of methods that may be implemented by superclasses, |
| 617 | * use \c class_getInstanceMethod or \c class_getClassMethod. |
| 618 | */ |
| 619 | OBJC_EXPORT Method _Nonnull * _Nullable |
| 620 | class_copyMethodList(Class _Nullable cls, unsigned int * _Nullable outCount) |
| 621 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 622 | |
| 623 | /** |
| 624 | * Returns a Boolean value that indicates whether a class conforms to a given protocol. |
| 625 | * |
| 626 | * @param cls The class you want to inspect. |
| 627 | * @param protocol A protocol. |
| 628 | * |
| 629 | * @return YES if cls conforms to protocol, otherwise NO. |
| 630 | * |
| 631 | * @note You should usually use NSObject's conformsToProtocol: method instead of this function. |
| 632 | */ |
| 633 | OBJC_EXPORT BOOL |
| 634 | class_conformsToProtocol(Class _Nullable cls, Protocol * _Nullable protocol) |
| 635 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 636 | |
| 637 | /** |
| 638 | * Describes the protocols adopted by a class. |
| 639 | * |
| 640 | * @param cls The class you want to inspect. |
| 641 | * @param outCount On return, contains the length of the returned array. |
| 642 | * If outCount is NULL, the length is not returned. |
| 643 | * |
| 644 | * @return An array of pointers of type Protocol* describing the protocols adopted |
| 645 | * by the class. Any protocols adopted by superclasses or other protocols are not included. |
| 646 | * The array contains *outCount pointers followed by a NULL terminator. You must free the array with free(). |
| 647 | * |
| 648 | * If cls adopts no protocols, or cls is Nil, returns NULL and *outCount is 0. |
| 649 | */ |
| 650 | OBJC_EXPORT Protocol * __unsafe_unretained _Nonnull * _Nullable |
| 651 | class_copyProtocolList(Class _Nullable cls, unsigned int * _Nullable outCount) |
| 652 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 653 | |
| 654 | /** |
| 655 | * Returns a property with a given name of a given class. |
| 656 | * |
| 657 | * @param cls The class you want to inspect. |
| 658 | * @param name The name of the property you want to inspect. |
| 659 | * |
| 660 | * @return A pointer of type \c objc_property_t describing the property, or |
| 661 | * \c NULL if the class does not declare a property with that name, |
| 662 | * or \c NULL if \e cls is \c Nil. |
| 663 | */ |
| 664 | OBJC_EXPORT objc_property_t _Nullable |
| 665 | class_getProperty(Class _Nullable cls, const char * _Nonnull name) |
| 666 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 667 | |
| 668 | /** |
| 669 | * Describes the properties declared by a class. |
| 670 | * |
| 671 | * @param cls The class you want to inspect. |
| 672 | * @param outCount On return, contains the length of the returned array. |
| 673 | * If \e outCount is \c NULL, the length is not returned. |
| 674 | * |
| 675 | * @return An array of pointers of type \c objc_property_t describing the properties |
| 676 | * declared by the class. Any properties declared by superclasses are not included. |
| 677 | * The array contains \c *outCount pointers followed by a \c NULL terminator. You must free the array with \c free(). |
| 678 | * |
| 679 | * If \e cls declares no properties, or \e cls is \c Nil, returns \c NULL and \c *outCount is \c 0. |
| 680 | */ |
| 681 | OBJC_EXPORT objc_property_t _Nonnull * _Nullable |
| 682 | class_copyPropertyList(Class _Nullable cls, unsigned int * _Nullable outCount) |
| 683 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 684 | |
| 685 | /** |
| 686 | * Returns a description of the \c Ivar layout for a given class. |
| 687 | * |
| 688 | * @param cls The class to inspect. |
| 689 | * |
| 690 | * @return A description of the \c Ivar layout for \e cls. |
| 691 | */ |
| 692 | OBJC_EXPORT const uint8_t * _Nullable |
| 693 | class_getIvarLayout(Class _Nullable cls) |
| 694 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 695 | |
| 696 | /** |
| 697 | * Returns a description of the layout of weak Ivars for a given class. |
| 698 | * |
| 699 | * @param cls The class to inspect. |
| 700 | * |
| 701 | * @return A description of the layout of the weak \c Ivars for \e cls. |
| 702 | */ |
| 703 | OBJC_EXPORT const uint8_t * _Nullable |
| 704 | class_getWeakIvarLayout(Class _Nullable cls) |
| 705 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 706 | |
| 707 | /** |
| 708 | * Adds a new method to a class with a given name and implementation. |
| 709 | * |
| 710 | * @param cls The class to which to add a method. |
| 711 | * @param name A selector that specifies the name of the method being added. |
| 712 | * @param imp A function which is the implementation of the new method. The function must take at least two arguments—self and _cmd. |
| 713 | * @param types An array of characters that describe the types of the arguments to the method. |
| 714 | * |
| 715 | * @return YES if the method was added successfully, otherwise NO |
| 716 | * (for example, the class already contains a method implementation with that name). |
| 717 | * |
| 718 | * @note class_addMethod will add an override of a superclass's implementation, |
| 719 | * but will not replace an existing implementation in this class. |
| 720 | * To change an existing implementation, use method_setImplementation. |
| 721 | */ |
| 722 | OBJC_EXPORT BOOL |
| 723 | class_addMethod(Class _Nullable cls, SEL _Nonnull name, IMP _Nonnull imp, |
| 724 | const char * _Nullable types) |
| 725 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 726 | |
| 727 | /** |
| 728 | * Replaces the implementation of a method for a given class. |
| 729 | * |
| 730 | * @param cls The class you want to modify. |
| 731 | * @param name A selector that identifies the method whose implementation you want to replace. |
| 732 | * @param imp The new implementation for the method identified by name for the class identified by cls. |
| 733 | * @param types An array of characters that describe the types of the arguments to the method. |
| 734 | * Since the function must take at least two arguments—self and _cmd, the second and third characters |
| 735 | * must be “@:” (the first character is the return type). |
| 736 | * |
| 737 | * @return The previous implementation of the method identified by \e name for the class identified by \e cls. |
| 738 | * |
| 739 | * @note This function behaves in two different ways: |
| 740 | * - If the method identified by \e name does not yet exist, it is added as if \c class_addMethod were called. |
| 741 | * The type encoding specified by \e types is used as given. |
| 742 | * - If the method identified by \e name does exist, its \c IMP is replaced as if \c method_setImplementation were called. |
| 743 | * The type encoding specified by \e types is ignored. |
| 744 | */ |
| 745 | OBJC_EXPORT IMP _Nullable |
| 746 | class_replaceMethod(Class _Nullable cls, SEL _Nonnull name, IMP _Nonnull imp, |
| 747 | const char * _Nullable types) |
| 748 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 749 | |
| 750 | /** |
| 751 | * Adds a new instance variable to a class. |
| 752 | * |
| 753 | * @return YES if the instance variable was added successfully, otherwise NO |
| 754 | * (for example, the class already contains an instance variable with that name). |
| 755 | * |
| 756 | * @note This function may only be called after objc_allocateClassPair and before objc_registerClassPair. |
| 757 | * Adding an instance variable to an existing class is not supported. |
| 758 | * @note The class must not be a metaclass. Adding an instance variable to a metaclass is not supported. |
| 759 | * @note The instance variable's minimum alignment in bytes is 1<<align. The minimum alignment of an instance |
| 760 | * variable depends on the ivar's type and the machine architecture. |
| 761 | * For variables of any pointer type, pass log2(sizeof(pointer_type)). |
| 762 | */ |
| 763 | OBJC_EXPORT BOOL |
| 764 | class_addIvar(Class _Nullable cls, const char * _Nonnull name, size_t size, |
| 765 | uint8_t alignment, const char * _Nullable types) |
| 766 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 767 | |
| 768 | /** |
| 769 | * Adds a protocol to a class. |
| 770 | * |
| 771 | * @param cls The class to modify. |
| 772 | * @param protocol The protocol to add to \e cls. |
| 773 | * |
| 774 | * @return \c YES if the method was added successfully, otherwise \c NO |
| 775 | * (for example, the class already conforms to that protocol). |
| 776 | */ |
| 777 | OBJC_EXPORT BOOL |
| 778 | class_addProtocol(Class _Nullable cls, Protocol * _Nonnull protocol) |
| 779 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 780 | |
| 781 | /** |
| 782 | * Adds a property to a class. |
| 783 | * |
| 784 | * @param cls The class to modify. |
| 785 | * @param name The name of the property. |
| 786 | * @param attributes An array of property attributes. |
| 787 | * @param attributeCount The number of attributes in \e attributes. |
| 788 | * |
| 789 | * @return \c YES if the property was added successfully, otherwise \c NO |
| 790 | * (for example, the class already has that property). |
| 791 | */ |
| 792 | OBJC_EXPORT BOOL |
| 793 | class_addProperty(Class _Nullable cls, const char * _Nonnull name, |
| 794 | const objc_property_attribute_t * _Nullable attributes, |
| 795 | unsigned int attributeCount) |
| 796 | OBJC_AVAILABLE(10.7, 4.3, 9.0, 1.0, 2.0); |
| 797 | |
| 798 | /** |
| 799 | * Replace a property of a class. |
| 800 | * |
| 801 | * @param cls The class to modify. |
| 802 | * @param name The name of the property. |
| 803 | * @param attributes An array of property attributes. |
| 804 | * @param attributeCount The number of attributes in \e attributes. |
| 805 | */ |
| 806 | OBJC_EXPORT void |
| 807 | class_replaceProperty(Class _Nullable cls, const char * _Nonnull name, |
| 808 | const objc_property_attribute_t * _Nullable attributes, |
| 809 | unsigned int attributeCount) |
| 810 | OBJC_AVAILABLE(10.7, 4.3, 9.0, 1.0, 2.0); |
| 811 | |
| 812 | /** |
| 813 | * Sets the Ivar layout for a given class. |
| 814 | * |
| 815 | * @param cls The class to modify. |
| 816 | * @param layout The layout of the \c Ivars for \e cls. |
| 817 | */ |
| 818 | OBJC_EXPORT void |
| 819 | class_setIvarLayout(Class _Nullable cls, const uint8_t * _Nullable layout) |
| 820 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 821 | |
| 822 | /** |
| 823 | * Sets the layout for weak Ivars for a given class. |
| 824 | * |
| 825 | * @param cls The class to modify. |
| 826 | * @param layout The layout of the weak Ivars for \e cls. |
| 827 | */ |
| 828 | OBJC_EXPORT void |
| 829 | class_setWeakIvarLayout(Class _Nullable cls, const uint8_t * _Nullable layout) |
| 830 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 831 | |
| 832 | /** |
| 833 | * Used by CoreFoundation's toll-free bridging. |
| 834 | * Return the id of the named class. |
| 835 | * |
| 836 | * @return The id of the named class, or an uninitialized class |
| 837 | * structure that will be used for the class when and if it does |
| 838 | * get loaded. |
| 839 | * |
| 840 | * @warning Do not call this function yourself. |
| 841 | */ |
| 842 | OBJC_EXPORT Class _Nonnull |
| 843 | objc_getFutureClass(const char * _Nonnull name) |
| 844 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0) |
| 845 | OBJC_ARC_UNAVAILABLE; |
| 846 | |
| 847 | |
| 848 | /* Instantiating Classes */ |
| 849 | |
| 850 | /** |
| 851 | * Creates an instance of a class, allocating memory for the class in the |
| 852 | * default malloc memory zone. |
| 853 | * |
| 854 | * @param cls The class that you wish to allocate an instance of. |
| 855 | * @param extraBytes An integer indicating the number of extra bytes to allocate. |
| 856 | * The additional bytes can be used to store additional instance variables beyond |
| 857 | * those defined in the class definition. |
| 858 | * |
| 859 | * @return An instance of the class \e cls. |
| 860 | */ |
| 861 | OBJC_EXPORT id _Nullable |
| 862 | class_createInstance(Class _Nullable cls, size_t extraBytes) |
| 863 | OBJC_RETURNS_RETAINED |
| 864 | OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0); |
| 865 | |
| 866 | /** |
| 867 | * Creates an instance of a class at the specific location provided. |
| 868 | * |
| 869 | * @param cls The class that you wish to allocate an instance of. |
| 870 | * @param bytes The location at which to allocate an instance of \e cls. |
| 871 | * Must point to at least \c class_getInstanceSize(cls) bytes of well-aligned, |
| 872 | * zero-filled memory. |
| 873 | * |
| 874 | * @return \e bytes on success, \c nil otherwise. (For example, \e cls or \e bytes |
| 875 | * might be \c nil) |
| 876 | * |
| 877 | * @see class_createInstance |
| 878 | */ |
| 879 | OBJC_EXPORT id _Nullable |
| 880 | objc_constructInstance(Class _Nullable cls, void * _Nullable bytes) |
| 881 | OBJC_AVAILABLE(10.6, 3.0, 9.0, 1.0, 2.0) |
| 882 | OBJC_ARC_UNAVAILABLE; |
| 883 | |
| 884 | /** |
| 885 | * Destroys an instance of a class without freeing memory and removes any |
| 886 | * associated references this instance might have had. |
| 887 | * |
| 888 | * @param obj The class instance to destroy. |
| 889 | * |
| 890 | * @return \e obj. Does nothing if \e obj is nil. |
| 891 | * |
| 892 | * @note CF and other clients do call this under GC. |
| 893 | */ |
| 894 | OBJC_EXPORT void * _Nullable objc_destructInstance(id _Nullable obj) |
| 895 | OBJC_AVAILABLE(10.6, 3.0, 9.0, 1.0, 2.0) |
| 896 | OBJC_ARC_UNAVAILABLE; |
| 897 | |
| 898 | |
| 899 | /* Adding Classes */ |
| 900 | |
| 901 | /** |
| 902 | * Creates a new class and metaclass. |
| 903 | * |
| 904 | * @param superclass The class to use as the new class's superclass, or \c Nil to create a new root class. |
| 905 | * @param name The string to use as the new class's name. The string will be copied. |
| 906 | * @param extraBytes The number of bytes to allocate for indexed ivars at the end of |
| 907 | * the class and metaclass objects. This should usually be \c 0. |
| 908 | * |
| 909 | * @return The new class, or Nil if the class could not be created (for example, the desired name is already in use). |
| 910 | * |
| 911 | * @note You can get a pointer to the new metaclass by calling \c object_getClass(newClass). |
| 912 | * @note To create a new class, start by calling \c objc_allocateClassPair. |
| 913 | * Then set the class's attributes with functions like \c class_addMethod and \c class_addIvar. |
| 914 | * When you are done building the class, call \c objc_registerClassPair. The new class is now ready for use. |
| 915 | * @note Instance methods and instance variables should be added to the class itself. |
| 916 | * Class methods should be added to the metaclass. |
| 917 | */ |
| 918 | OBJC_EXPORT Class _Nullable |
| 919 | objc_allocateClassPair(Class _Nullable superclass, const char * _Nonnull name, |
| 920 | size_t extraBytes) |
| 921 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 922 | |
| 923 | /** |
| 924 | * Registers a class that was allocated using \c objc_allocateClassPair. |
| 925 | * |
| 926 | * @param cls The class you want to register. |
| 927 | */ |
| 928 | OBJC_EXPORT void |
| 929 | objc_registerClassPair(Class _Nonnull cls) |
| 930 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 931 | |
| 932 | /** |
| 933 | * Used by Foundation's Key-Value Observing. |
| 934 | * |
| 935 | * @warning Do not call this function yourself. |
| 936 | */ |
| 937 | OBJC_EXPORT Class _Nonnull |
| 938 | objc_duplicateClass(Class _Nonnull original, const char * _Nonnull name, |
| 939 | size_t extraBytes) |
| 940 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 941 | |
| 942 | /** |
| 943 | * Destroy a class and its associated metaclass. |
| 944 | * |
| 945 | * @param cls The class to be destroyed. It must have been allocated with |
| 946 | * \c objc_allocateClassPair |
| 947 | * |
| 948 | * @warning Do not call if instances of this class or a subclass exist. |
| 949 | */ |
| 950 | OBJC_EXPORT void |
| 951 | objc_disposeClassPair(Class _Nonnull cls) |
| 952 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 953 | |
| 954 | |
| 955 | /* Working with Methods */ |
| 956 | |
| 957 | /** |
| 958 | * Returns the name of a method. |
| 959 | * |
| 960 | * @param m The method to inspect. |
| 961 | * |
| 962 | * @return A pointer of type SEL. |
| 963 | * |
| 964 | * @note To get the method name as a C string, call \c sel_getName(method_getName(method)). |
| 965 | */ |
| 966 | OBJC_EXPORT SEL _Nonnull |
| 967 | method_getName(Method _Nonnull m) |
| 968 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 969 | |
| 970 | /** |
| 971 | * Returns the implementation of a method. |
| 972 | * |
| 973 | * @param m The method to inspect. |
| 974 | * |
| 975 | * @return A function pointer of type IMP. |
| 976 | */ |
| 977 | OBJC_EXPORT IMP _Nonnull |
| 978 | method_getImplementation(Method _Nonnull m) |
| 979 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 980 | |
| 981 | /** |
| 982 | * Returns a string describing a method's parameter and return types. |
| 983 | * |
| 984 | * @param m The method to inspect. |
| 985 | * |
| 986 | * @return A C string. The string may be \c NULL. |
| 987 | */ |
| 988 | OBJC_EXPORT const char * _Nullable |
| 989 | method_getTypeEncoding(Method _Nonnull m) |
| 990 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 991 | |
| 992 | /** |
| 993 | * Returns the number of arguments accepted by a method. |
| 994 | * |
| 995 | * @param m A pointer to a \c Method data structure. Pass the method in question. |
| 996 | * |
| 997 | * @return An integer containing the number of arguments accepted by the given method. |
| 998 | */ |
| 999 | OBJC_EXPORT unsigned int |
| 1000 | method_getNumberOfArguments(Method _Nonnull m) |
| 1001 | OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0); |
| 1002 | |
| 1003 | /** |
| 1004 | * Returns a string describing a method's return type. |
| 1005 | * |
| 1006 | * @param m The method to inspect. |
| 1007 | * |
| 1008 | * @return A C string describing the return type. You must free the string with \c free(). |
| 1009 | */ |
| 1010 | OBJC_EXPORT char * _Nonnull |
| 1011 | method_copyReturnType(Method _Nonnull m) |
| 1012 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 1013 | |
| 1014 | /** |
| 1015 | * Returns a string describing a single parameter type of a method. |
| 1016 | * |
| 1017 | * @param m The method to inspect. |
| 1018 | * @param index The index of the parameter to inspect. |
| 1019 | * |
| 1020 | * @return A C string describing the type of the parameter at index \e index, or \c NULL |
| 1021 | * if method has no parameter index \e index. You must free the string with \c free(). |
| 1022 | */ |
| 1023 | OBJC_EXPORT char * _Nullable |
| 1024 | method_copyArgumentType(Method _Nonnull m, unsigned int index) |
| 1025 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 1026 | |
| 1027 | /** |
| 1028 | * Returns by reference a string describing a method's return type. |
| 1029 | * |
| 1030 | * @param m The method you want to inquire about. |
| 1031 | * @param dst The reference string to store the description. |
| 1032 | * @param dst_len The maximum number of characters that can be stored in \e dst. |
| 1033 | * |
| 1034 | * @note The method's return type string is copied to \e dst. |
| 1035 | * \e dst is filled as if \c strncpy(dst, parameter_type, dst_len) were called. |
| 1036 | */ |
| 1037 | OBJC_EXPORT void |
| 1038 | method_getReturnType(Method _Nonnull m, char * _Nonnull dst, size_t dst_len) |
| 1039 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 1040 | |
| 1041 | /** |
| 1042 | * Returns by reference a string describing a single parameter type of a method. |
| 1043 | * |
| 1044 | * @param m The method you want to inquire about. |
| 1045 | * @param index The index of the parameter you want to inquire about. |
| 1046 | * @param dst The reference string to store the description. |
| 1047 | * @param dst_len The maximum number of characters that can be stored in \e dst. |
| 1048 | * |
| 1049 | * @note The parameter type string is copied to \e dst. \e dst is filled as if \c strncpy(dst, parameter_type, dst_len) |
| 1050 | * were called. If the method contains no parameter with that index, \e dst is filled as |
| 1051 | * if \c strncpy(dst, "", dst_len) were called. |
| 1052 | */ |
| 1053 | OBJC_EXPORT void |
| 1054 | method_getArgumentType(Method _Nonnull m, unsigned int index, |
| 1055 | char * _Nullable dst, size_t dst_len) |
| 1056 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 1057 | |
| 1058 | OBJC_EXPORT struct objc_method_description * _Nonnull |
| 1059 | method_getDescription(Method _Nonnull m) |
| 1060 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 1061 | |
| 1062 | /** |
| 1063 | * Sets the implementation of a method. |
| 1064 | * |
| 1065 | * @param m The method for which to set an implementation. |
| 1066 | * @param imp The implementation to set to this method. |
| 1067 | * |
| 1068 | * @return The previous implementation of the method. |
| 1069 | */ |
| 1070 | OBJC_EXPORT IMP _Nonnull |
| 1071 | method_setImplementation(Method _Nonnull m, IMP _Nonnull imp) |
| 1072 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 1073 | |
| 1074 | /** |
| 1075 | * Exchanges the implementations of two methods. |
| 1076 | * |
| 1077 | * @param m1 Method to exchange with second method. |
| 1078 | * @param m2 Method to exchange with first method. |
| 1079 | * |
| 1080 | * @note This is an atomic version of the following: |
| 1081 | * \code |
| 1082 | * IMP imp1 = method_getImplementation(m1); |
| 1083 | * IMP imp2 = method_getImplementation(m2); |
| 1084 | * method_setImplementation(m1, imp2); |
| 1085 | * method_setImplementation(m2, imp1); |
| 1086 | * \endcode |
| 1087 | */ |
| 1088 | OBJC_EXPORT void |
| 1089 | method_exchangeImplementations(Method _Nonnull m1, Method _Nonnull m2) |
| 1090 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 1091 | |
| 1092 | |
| 1093 | /* Working with Instance Variables */ |
| 1094 | |
| 1095 | /** |
| 1096 | * Returns the name of an instance variable. |
| 1097 | * |
| 1098 | * @param v The instance variable you want to enquire about. |
| 1099 | * |
| 1100 | * @return A C string containing the instance variable's name. |
| 1101 | */ |
| 1102 | OBJC_EXPORT const char * _Nullable |
| 1103 | ivar_getName(Ivar _Nonnull v) |
| 1104 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 1105 | |
| 1106 | /** |
| 1107 | * Returns the type string of an instance variable. |
| 1108 | * |
| 1109 | * @param v The instance variable you want to enquire about. |
| 1110 | * |
| 1111 | * @return A C string containing the instance variable's type encoding. |
| 1112 | * |
| 1113 | * @note For possible values, see Objective-C Runtime Programming Guide > Type Encodings. |
| 1114 | */ |
| 1115 | OBJC_EXPORT const char * _Nullable |
| 1116 | ivar_getTypeEncoding(Ivar _Nonnull v) |
| 1117 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 1118 | |
| 1119 | /** |
| 1120 | * Returns the offset of an instance variable. |
| 1121 | * |
| 1122 | * @param v The instance variable you want to enquire about. |
| 1123 | * |
| 1124 | * @return The offset of \e v. |
| 1125 | * |
| 1126 | * @note For instance variables of type \c id or other object types, call \c object_getIvar |
| 1127 | * and \c object_setIvar instead of using this offset to access the instance variable data directly. |
| 1128 | */ |
| 1129 | OBJC_EXPORT ptrdiff_t |
| 1130 | ivar_getOffset(Ivar _Nonnull v) |
| 1131 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 1132 | |
| 1133 | |
| 1134 | /* Working with Properties */ |
| 1135 | |
| 1136 | /** |
| 1137 | * Returns the name of a property. |
| 1138 | * |
| 1139 | * @param property The property you want to inquire about. |
| 1140 | * |
| 1141 | * @return A C string containing the property's name. |
| 1142 | */ |
| 1143 | OBJC_EXPORT const char * _Nonnull |
| 1144 | property_getName(objc_property_t _Nonnull property) |
| 1145 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 1146 | |
| 1147 | /** |
| 1148 | * Returns the attribute string of a property. |
| 1149 | * |
| 1150 | * @param property A property. |
| 1151 | * |
| 1152 | * @return A C string containing the property's attributes. |
| 1153 | * |
| 1154 | * @note The format of the attribute string is described in Declared Properties in Objective-C Runtime Programming Guide. |
| 1155 | */ |
| 1156 | OBJC_EXPORT const char * _Nullable |
| 1157 | property_getAttributes(objc_property_t _Nonnull property) |
| 1158 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 1159 | |
| 1160 | /** |
| 1161 | * Returns an array of property attributes for a property. |
| 1162 | * |
| 1163 | * @param property The property whose attributes you want copied. |
| 1164 | * @param outCount The number of attributes returned in the array. |
| 1165 | * |
| 1166 | * @return An array of property attributes; must be free'd() by the caller. |
| 1167 | */ |
| 1168 | OBJC_EXPORT objc_property_attribute_t * _Nullable |
| 1169 | property_copyAttributeList(objc_property_t _Nonnull property, |
| 1170 | unsigned int * _Nullable outCount) |
| 1171 | OBJC_AVAILABLE(10.7, 4.3, 9.0, 1.0, 2.0); |
| 1172 | |
| 1173 | /** |
| 1174 | * Returns the value of a property attribute given the attribute name. |
| 1175 | * |
| 1176 | * @param property The property whose attribute value you are interested in. |
| 1177 | * @param attributeName C string representing the attribute name. |
| 1178 | * |
| 1179 | * @return The value string of the attribute \e attributeName if it exists in |
| 1180 | * \e property, \c nil otherwise. |
| 1181 | */ |
| 1182 | OBJC_EXPORT char * _Nullable |
| 1183 | property_copyAttributeValue(objc_property_t _Nonnull property, |
| 1184 | const char * _Nonnull attributeName) |
| 1185 | OBJC_AVAILABLE(10.7, 4.3, 9.0, 1.0, 2.0); |
| 1186 | |
| 1187 | |
| 1188 | /* Working with Protocols */ |
| 1189 | |
| 1190 | /** |
| 1191 | * Returns a specified protocol. |
| 1192 | * |
| 1193 | * @param name The name of a protocol. |
| 1194 | * |
| 1195 | * @return The protocol named \e name, or \c NULL if no protocol named \e name could be found. |
| 1196 | * |
| 1197 | * @note This function acquires the runtime lock. |
| 1198 | */ |
| 1199 | OBJC_EXPORT Protocol * _Nullable |
| 1200 | objc_getProtocol(const char * _Nonnull name) |
| 1201 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 1202 | |
| 1203 | /** |
| 1204 | * Returns an array of all the protocols known to the runtime. |
| 1205 | * |
| 1206 | * @param outCount Upon return, contains the number of protocols in the returned array. |
| 1207 | * |
| 1208 | * @return A C array of all the protocols known to the runtime. The array contains \c *outCount |
| 1209 | * pointers followed by a \c NULL terminator. You must free the list with \c free(). |
| 1210 | * |
| 1211 | * @note This function acquires the runtime lock. |
| 1212 | */ |
| 1213 | OBJC_EXPORT Protocol * __unsafe_unretained _Nonnull * _Nullable |
| 1214 | objc_copyProtocolList(unsigned int * _Nullable outCount) |
| 1215 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 1216 | |
| 1217 | /** |
| 1218 | * Returns a Boolean value that indicates whether one protocol conforms to another protocol. |
| 1219 | * |
| 1220 | * @param proto A protocol. |
| 1221 | * @param other A protocol. |
| 1222 | * |
| 1223 | * @return \c YES if \e proto conforms to \e other, otherwise \c NO. |
| 1224 | * |
| 1225 | * @note One protocol can incorporate other protocols using the same syntax |
| 1226 | * that classes use to adopt a protocol: |
| 1227 | * \code |
| 1228 | * @protocol ProtocolName < protocol list > |
| 1229 | * \endcode |
| 1230 | * All the protocols listed between angle brackets are considered part of the ProtocolName protocol. |
| 1231 | */ |
| 1232 | OBJC_EXPORT BOOL |
| 1233 | protocol_conformsToProtocol(Protocol * _Nullable proto, |
| 1234 | Protocol * _Nullable other) |
| 1235 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 1236 | |
| 1237 | /** |
| 1238 | * Returns a Boolean value that indicates whether two protocols are equal. |
| 1239 | * |
| 1240 | * @param proto A protocol. |
| 1241 | * @param other A protocol. |
| 1242 | * |
| 1243 | * @return \c YES if \e proto is the same as \e other, otherwise \c NO. |
| 1244 | */ |
| 1245 | OBJC_EXPORT BOOL |
| 1246 | protocol_isEqual(Protocol * _Nullable proto, Protocol * _Nullable other) |
| 1247 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 1248 | |
| 1249 | /** |
| 1250 | * Returns the name of a protocol. |
| 1251 | * |
| 1252 | * @param proto A protocol. |
| 1253 | * |
| 1254 | * @return The name of the protocol \e p as a C string. |
| 1255 | */ |
| 1256 | OBJC_EXPORT const char * _Nonnull |
| 1257 | protocol_getName(Protocol * _Nonnull proto) |
| 1258 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 1259 | |
| 1260 | /** |
| 1261 | * Returns a method description structure for a specified method of a given protocol. |
| 1262 | * |
| 1263 | * @param proto A protocol. |
| 1264 | * @param aSel A selector. |
| 1265 | * @param isRequiredMethod A Boolean value that indicates whether aSel is a required method. |
| 1266 | * @param isInstanceMethod A Boolean value that indicates whether aSel is an instance method. |
| 1267 | * |
| 1268 | * @return An \c objc_method_description structure that describes the method specified by \e aSel, |
| 1269 | * \e isRequiredMethod, and \e isInstanceMethod for the protocol \e p. |
| 1270 | * If the protocol does not contain the specified method, returns an \c objc_method_description structure |
| 1271 | * with the value \c {NULL, \c NULL}. |
| 1272 | * |
| 1273 | * @note This function recursively searches any protocols that this protocol conforms to. |
| 1274 | */ |
| 1275 | OBJC_EXPORT struct objc_method_description |
| 1276 | protocol_getMethodDescription(Protocol * _Nonnull proto, SEL _Nonnull aSel, |
| 1277 | BOOL isRequiredMethod, BOOL isInstanceMethod) |
| 1278 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 1279 | |
| 1280 | /** |
| 1281 | * Returns an array of method descriptions of methods meeting a given specification for a given protocol. |
| 1282 | * |
| 1283 | * @param proto A protocol. |
| 1284 | * @param isRequiredMethod A Boolean value that indicates whether returned methods should |
| 1285 | * be required methods (pass YES to specify required methods). |
| 1286 | * @param isInstanceMethod A Boolean value that indicates whether returned methods should |
| 1287 | * be instance methods (pass YES to specify instance methods). |
| 1288 | * @param outCount Upon return, contains the number of method description structures in the returned array. |
| 1289 | * |
| 1290 | * @return A C array of \c objc_method_description structures containing the names and types of \e p's methods |
| 1291 | * specified by \e isRequiredMethod and \e isInstanceMethod. The array contains \c *outCount pointers followed |
| 1292 | * by a \c NULL terminator. You must free the list with \c free(). |
| 1293 | * If the protocol declares no methods that meet the specification, \c NULL is returned and \c *outCount is 0. |
| 1294 | * |
| 1295 | * @note Methods in other protocols adopted by this protocol are not included. |
| 1296 | */ |
| 1297 | OBJC_EXPORT struct objc_method_description * _Nullable |
| 1298 | protocol_copyMethodDescriptionList(Protocol * _Nonnull proto, |
| 1299 | BOOL isRequiredMethod, |
| 1300 | BOOL isInstanceMethod, |
| 1301 | unsigned int * _Nullable outCount) |
| 1302 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 1303 | |
| 1304 | /** |
| 1305 | * Returns the specified property of a given protocol. |
| 1306 | * |
| 1307 | * @param proto A protocol. |
| 1308 | * @param name The name of a property. |
| 1309 | * @param isRequiredProperty \c YES searches for a required property, \c NO searches for an optional property. |
| 1310 | * @param isInstanceProperty \c YES searches for an instance property, \c NO searches for a class property. |
| 1311 | * |
| 1312 | * @return The property specified by \e name, \e isRequiredProperty, and \e isInstanceProperty for \e proto, |
| 1313 | * or \c NULL if none of \e proto's properties meets the specification. |
| 1314 | */ |
| 1315 | OBJC_EXPORT objc_property_t _Nullable |
| 1316 | protocol_getProperty(Protocol * _Nonnull proto, |
| 1317 | const char * _Nonnull name, |
| 1318 | BOOL isRequiredProperty, BOOL isInstanceProperty) |
| 1319 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 1320 | |
| 1321 | /** |
| 1322 | * Returns an array of the required instance properties declared by a protocol. |
| 1323 | * |
| 1324 | * @note Identical to |
| 1325 | * \code |
| 1326 | * protocol_copyPropertyList2(proto, outCount, YES, YES); |
| 1327 | * \endcode |
| 1328 | */ |
| 1329 | OBJC_EXPORT objc_property_t _Nonnull * _Nullable |
| 1330 | protocol_copyPropertyList(Protocol * _Nonnull proto, |
| 1331 | unsigned int * _Nullable outCount) |
| 1332 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 1333 | |
| 1334 | /** |
| 1335 | * Returns an array of properties declared by a protocol. |
| 1336 | * |
| 1337 | * @param proto A protocol. |
| 1338 | * @param outCount Upon return, contains the number of elements in the returned array. |
| 1339 | * @param isRequiredProperty \c YES returns required properties, \c NO returns optional properties. |
| 1340 | * @param isInstanceProperty \c YES returns instance properties, \c NO returns class properties. |
| 1341 | * |
| 1342 | * @return A C array of pointers of type \c objc_property_t describing the properties declared by \e proto. |
| 1343 | * Any properties declared by other protocols adopted by this protocol are not included. The array contains |
| 1344 | * \c *outCount pointers followed by a \c NULL terminator. You must free the array with \c free(). |
| 1345 | * If the protocol declares no matching properties, \c NULL is returned and \c *outCount is \c 0. |
| 1346 | */ |
| 1347 | OBJC_EXPORT objc_property_t _Nonnull * _Nullable |
| 1348 | protocol_copyPropertyList2(Protocol * _Nonnull proto, |
| 1349 | unsigned int * _Nullable outCount, |
| 1350 | BOOL isRequiredProperty, BOOL isInstanceProperty) |
| 1351 | OBJC_AVAILABLE(10.12, 10.0, 10.0, 3.0, 2.0); |
| 1352 | |
| 1353 | /** |
| 1354 | * Returns an array of the protocols adopted by a protocol. |
| 1355 | * |
| 1356 | * @param proto A protocol. |
| 1357 | * @param outCount Upon return, contains the number of elements in the returned array. |
| 1358 | * |
| 1359 | * @return A C array of protocols adopted by \e proto. The array contains \e *outCount pointers |
| 1360 | * followed by a \c NULL terminator. You must free the array with \c free(). |
| 1361 | * If the protocol adopts no other protocols, \c NULL is returned and \c *outCount is \c 0. |
| 1362 | */ |
| 1363 | OBJC_EXPORT Protocol * __unsafe_unretained _Nonnull * _Nullable |
| 1364 | protocol_copyProtocolList(Protocol * _Nonnull proto, |
| 1365 | unsigned int * _Nullable outCount) |
| 1366 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 1367 | |
| 1368 | /** |
| 1369 | * Creates a new protocol instance that cannot be used until registered with |
| 1370 | * \c objc_registerProtocol() |
| 1371 | * |
| 1372 | * @param name The name of the protocol to create. |
| 1373 | * |
| 1374 | * @return The Protocol instance on success, \c nil if a protocol |
| 1375 | * with the same name already exists. |
| 1376 | * @note There is no dispose method for this. |
| 1377 | */ |
| 1378 | OBJC_EXPORT Protocol * _Nullable |
| 1379 | objc_allocateProtocol(const char * _Nonnull name) |
| 1380 | OBJC_AVAILABLE(10.7, 4.3, 9.0, 1.0, 2.0); |
| 1381 | |
| 1382 | /** |
| 1383 | * Registers a newly constructed protocol with the runtime. The protocol |
| 1384 | * will be ready for use and is immutable after this. |
| 1385 | * |
| 1386 | * @param proto The protocol you want to register. |
| 1387 | */ |
| 1388 | OBJC_EXPORT void |
| 1389 | objc_registerProtocol(Protocol * _Nonnull proto) |
| 1390 | OBJC_AVAILABLE(10.7, 4.3, 9.0, 1.0, 2.0); |
| 1391 | |
| 1392 | /** |
| 1393 | * Adds a method to a protocol. The protocol must be under construction. |
| 1394 | * |
| 1395 | * @param proto The protocol to add a method to. |
| 1396 | * @param name The name of the method to add. |
| 1397 | * @param types A C string that represents the method signature. |
| 1398 | * @param isRequiredMethod YES if the method is not an optional method. |
| 1399 | * @param isInstanceMethod YES if the method is an instance method. |
| 1400 | */ |
| 1401 | OBJC_EXPORT void |
| 1402 | protocol_addMethodDescription(Protocol * _Nonnull proto, SEL _Nonnull name, |
| 1403 | const char * _Nullable types, |
| 1404 | BOOL isRequiredMethod, BOOL isInstanceMethod) |
| 1405 | OBJC_AVAILABLE(10.7, 4.3, 9.0, 1.0, 2.0); |
| 1406 | |
| 1407 | /** |
| 1408 | * Adds an incorporated protocol to another protocol. The protocol being |
| 1409 | * added to must still be under construction, while the additional protocol |
| 1410 | * must be already constructed. |
| 1411 | * |
| 1412 | * @param proto The protocol you want to add to, it must be under construction. |
| 1413 | * @param addition The protocol you want to incorporate into \e proto, it must be registered. |
| 1414 | */ |
| 1415 | OBJC_EXPORT void |
| 1416 | protocol_addProtocol(Protocol * _Nonnull proto, Protocol * _Nonnull addition) |
| 1417 | OBJC_AVAILABLE(10.7, 4.3, 9.0, 1.0, 2.0); |
| 1418 | |
| 1419 | /** |
| 1420 | * Adds a property to a protocol. The protocol must be under construction. |
| 1421 | * |
| 1422 | * @param proto The protocol to add a property to. |
| 1423 | * @param name The name of the property. |
| 1424 | * @param attributes An array of property attributes. |
| 1425 | * @param attributeCount The number of attributes in \e attributes. |
| 1426 | * @param isRequiredProperty YES if the property (accessor methods) is not optional. |
| 1427 | * @param isInstanceProperty YES if the property (accessor methods) are instance methods. |
| 1428 | * This is the only case allowed fo a property, as a result, setting this to NO will |
| 1429 | * not add the property to the protocol at all. |
| 1430 | */ |
| 1431 | OBJC_EXPORT void |
| 1432 | protocol_addProperty(Protocol * _Nonnull proto, const char * _Nonnull name, |
| 1433 | const objc_property_attribute_t * _Nullable attributes, |
| 1434 | unsigned int attributeCount, |
| 1435 | BOOL isRequiredProperty, BOOL isInstanceProperty) |
| 1436 | OBJC_AVAILABLE(10.7, 4.3, 9.0, 1.0, 2.0); |
| 1437 | |
| 1438 | |
| 1439 | /* Working with Libraries */ |
| 1440 | |
| 1441 | /** |
| 1442 | * Returns the names of all the loaded Objective-C frameworks and dynamic |
| 1443 | * libraries. |
| 1444 | * |
| 1445 | * @param outCount The number of names returned. |
| 1446 | * |
| 1447 | * @return An array of C strings of names. Must be free()'d by caller. |
| 1448 | */ |
| 1449 | OBJC_EXPORT const char * _Nonnull * _Nonnull |
| 1450 | objc_copyImageNames(unsigned int * _Nullable outCount) |
| 1451 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 1452 | |
| 1453 | /** |
| 1454 | * Returns the dynamic library name a class originated from. |
| 1455 | * |
| 1456 | * @param cls The class you are inquiring about. |
| 1457 | * |
| 1458 | * @return The name of the library containing this class. |
| 1459 | */ |
| 1460 | OBJC_EXPORT const char * _Nullable |
| 1461 | class_getImageName(Class _Nullable cls) |
| 1462 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 1463 | |
| 1464 | /** |
| 1465 | * Returns the names of all the classes within a library. |
| 1466 | * |
| 1467 | * @param image The library or framework you are inquiring about. |
| 1468 | * @param outCount The number of class names returned. |
| 1469 | * |
| 1470 | * @return An array of C strings representing the class names. |
| 1471 | */ |
| 1472 | OBJC_EXPORT const char * _Nonnull * _Nullable |
| 1473 | objc_copyClassNamesForImage(const char * _Nonnull image, |
| 1474 | unsigned int * _Nullable outCount) |
| 1475 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 1476 | |
| 1477 | |
| 1478 | /* Working with Selectors */ |
| 1479 | |
| 1480 | /** |
| 1481 | * Returns a Boolean value that indicates whether two selectors are equal. |
| 1482 | * |
| 1483 | * @param lhs The selector to compare with rhs. |
| 1484 | * @param rhs The selector to compare with lhs. |
| 1485 | * |
| 1486 | * @return \c YES if \e lhs and \e rhs are equal, otherwise \c NO. |
| 1487 | * |
| 1488 | * @note sel_isEqual is equivalent to ==. |
| 1489 | */ |
| 1490 | OBJC_EXPORT BOOL |
| 1491 | sel_isEqual(SEL _Nonnull lhs, SEL _Nonnull rhs) |
| 1492 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 1493 | |
| 1494 | |
| 1495 | /* Objective-C Language Features */ |
| 1496 | |
| 1497 | /** |
| 1498 | * This function is inserted by the compiler when a mutation |
| 1499 | * is detected during a foreach iteration. It gets called |
| 1500 | * when a mutation occurs, and the enumerationMutationHandler |
| 1501 | * is enacted if it is set up. A fatal error occurs if a handler is not set up. |
| 1502 | * |
| 1503 | * @param obj The object being mutated. |
| 1504 | * |
| 1505 | */ |
| 1506 | OBJC_EXPORT void |
| 1507 | objc_enumerationMutation(id _Nonnull obj) |
| 1508 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 1509 | |
| 1510 | /** |
| 1511 | * Sets the current mutation handler. |
| 1512 | * |
| 1513 | * @param handler Function pointer to the new mutation handler. |
| 1514 | */ |
| 1515 | OBJC_EXPORT void |
| 1516 | objc_setEnumerationMutationHandler(void (*_Nullable handler)(id _Nonnull )) |
| 1517 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 1518 | |
| 1519 | /** |
| 1520 | * Set the function to be called by objc_msgForward. |
| 1521 | * |
| 1522 | * @param fwd Function to be jumped to by objc_msgForward. |
| 1523 | * @param fwd_stret Function to be jumped to by objc_msgForward_stret. |
| 1524 | * |
| 1525 | * @see message.h::_objc_msgForward |
| 1526 | */ |
| 1527 | OBJC_EXPORT void |
| 1528 | objc_setForwardHandler(void * _Nonnull fwd, void * _Nonnull fwd_stret) |
| 1529 | OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0); |
| 1530 | |
| 1531 | #if !0 |
| 1532 | |
| 1533 | /** |
| 1534 | * Creates a pointer to a function that will call the block |
| 1535 | * when the method is called. |
| 1536 | * |
| 1537 | * @param block The block that implements this method. Its signature should |
| 1538 | * be: method_return_type ^(id self, method_args...). |
| 1539 | * The selector is not available as a parameter to this block. |
| 1540 | * The block is copied with \c Block_copy(). |
| 1541 | * |
| 1542 | * @return The IMP that calls this block. Must be disposed of with |
| 1543 | * \c imp_removeBlock. |
| 1544 | */ |
| 1545 | OBJC_EXPORT IMP _Nonnull |
| 1546 | imp_implementationWithBlock(id _Nonnull block) |
| 1547 | OBJC_AVAILABLE(10.7, 4.3, 9.0, 1.0, 2.0); |
| 1548 | |
| 1549 | /** |
| 1550 | * Return the block associated with an IMP that was created using |
| 1551 | * \c imp_implementationWithBlock. |
| 1552 | * |
| 1553 | * @param anImp The IMP that calls this block. |
| 1554 | * |
| 1555 | * @return The block called by \e anImp. |
| 1556 | */ |
| 1557 | OBJC_EXPORT id _Nullable |
| 1558 | imp_getBlock(IMP _Nonnull anImp) |
| 1559 | OBJC_AVAILABLE(10.7, 4.3, 9.0, 1.0, 2.0); |
| 1560 | |
| 1561 | /** |
| 1562 | * Disassociates a block from an IMP that was created using |
| 1563 | * \c imp_implementationWithBlock and releases the copy of the |
| 1564 | * block that was created. |
| 1565 | * |
| 1566 | * @param anImp An IMP that was created using \c imp_implementationWithBlock. |
| 1567 | * |
| 1568 | * @return YES if the block was released successfully, NO otherwise. |
| 1569 | * (For example, the block might not have been used to create an IMP previously). |
| 1570 | */ |
| 1571 | OBJC_EXPORT BOOL |
| 1572 | imp_removeBlock(IMP _Nonnull anImp) |
| 1573 | OBJC_AVAILABLE(10.7, 4.3, 9.0, 1.0, 2.0); |
| 1574 | |
| 1575 | #endif |
| 1576 | |
| 1577 | /** |
| 1578 | * This loads the object referenced by a weak pointer and returns it, after |
| 1579 | * retaining and autoreleasing the object to ensure that it stays alive |
| 1580 | * long enough for the caller to use it. This function would be used |
| 1581 | * anywhere a __weak variable is used in an expression. |
| 1582 | * |
| 1583 | * @param location The weak pointer address |
| 1584 | * |
| 1585 | * @return The object pointed to by \e location, or \c nil if \e *location is \c nil. |
| 1586 | */ |
| 1587 | OBJC_EXPORT id _Nullable |
| 1588 | objc_loadWeak(id _Nullable * _Nonnull location) |
| 1589 | OBJC_AVAILABLE(10.7, 5.0, 9.0, 1.0, 2.0); |
| 1590 | |
| 1591 | /** |
| 1592 | * This function stores a new value into a __weak variable. It would |
| 1593 | * be used anywhere a __weak variable is the target of an assignment. |
| 1594 | * |
| 1595 | * @param location The address of the weak pointer itself |
| 1596 | * @param obj The new object this weak ptr should now point to |
| 1597 | * |
| 1598 | * @return The value stored into \e location, i.e. \e obj |
| 1599 | */ |
| 1600 | OBJC_EXPORT id _Nullable |
| 1601 | objc_storeWeak(id _Nullable * _Nonnull location, id _Nullable obj) |
| 1602 | OBJC_AVAILABLE(10.7, 5.0, 9.0, 1.0, 2.0); |
| 1603 | |
| 1604 | |
| 1605 | /* Associative References */ |
| 1606 | |
| 1607 | /** |
| 1608 | * Policies related to associative references. |
| 1609 | * These are options to objc_setAssociatedObject() |
| 1610 | */ |
| 1611 | typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy) { |
| 1612 | OBJC_ASSOCIATION_ASSIGN = 0, /**< Specifies an unsafe unretained reference to the associated object. */ |
| 1613 | OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, /**< Specifies a strong reference to the associated object. |
| 1614 | * The association is not made atomically. */ |
| 1615 | OBJC_ASSOCIATION_COPY_NONATOMIC = 3, /**< Specifies that the associated object is copied. |
| 1616 | * The association is not made atomically. */ |
| 1617 | OBJC_ASSOCIATION_RETAIN = 01401, /**< Specifies a strong reference to the associated object. |
| 1618 | * The association is made atomically. */ |
| 1619 | OBJC_ASSOCIATION_COPY = 01403 /**< Specifies that the associated object is copied. |
| 1620 | * The association is made atomically. */ |
| 1621 | }; |
| 1622 | |
| 1623 | /** |
| 1624 | * Sets an associated value for a given object using a given key and association policy. |
| 1625 | * |
| 1626 | * @param object The source object for the association. |
| 1627 | * @param key The key for the association. |
| 1628 | * @param value The value to associate with the key key for object. Pass nil to clear an existing association. |
| 1629 | * @param policy The policy for the association. For possible values, see “Associative Object Behaviors.” |
| 1630 | * |
| 1631 | * @see objc_setAssociatedObject |
| 1632 | * @see objc_removeAssociatedObjects |
| 1633 | */ |
| 1634 | OBJC_EXPORT void |
| 1635 | objc_setAssociatedObject(id _Nonnull object, const void * _Nonnull key, |
| 1636 | id _Nullable value, objc_AssociationPolicy policy) |
| 1637 | OBJC_AVAILABLE(10.6, 3.1, 9.0, 1.0, 2.0); |
| 1638 | |
| 1639 | /** |
| 1640 | * Returns the value associated with a given object for a given key. |
| 1641 | * |
| 1642 | * @param object The source object for the association. |
| 1643 | * @param key The key for the association. |
| 1644 | * |
| 1645 | * @return The value associated with the key \e key for \e object. |
| 1646 | * |
| 1647 | * @see objc_setAssociatedObject |
| 1648 | */ |
| 1649 | OBJC_EXPORT id _Nullable |
| 1650 | objc_getAssociatedObject(id _Nonnull object, const void * _Nonnull key) |
| 1651 | OBJC_AVAILABLE(10.6, 3.1, 9.0, 1.0, 2.0); |
| 1652 | |
| 1653 | /** |
| 1654 | * Removes all associations for a given object. |
| 1655 | * |
| 1656 | * @param object An object that maintains associated objects. |
| 1657 | * |
| 1658 | * @note The main purpose of this function is to make it easy to return an object |
| 1659 | * to a "pristine state”. You should not use this function for general removal of |
| 1660 | * associations from objects, since it also removes associations that other clients |
| 1661 | * may have added to the object. Typically you should use \c objc_setAssociatedObject |
| 1662 | * with a nil value to clear an association. |
| 1663 | * |
| 1664 | * @see objc_setAssociatedObject |
| 1665 | * @see objc_getAssociatedObject |
| 1666 | */ |
| 1667 | OBJC_EXPORT void |
| 1668 | objc_removeAssociatedObjects(id _Nonnull object) |
| 1669 | OBJC_AVAILABLE(10.6, 3.1, 9.0, 1.0, 2.0); |
| 1670 | |
| 1671 | |
| 1672 | /* Hooks for Swift */ |
| 1673 | |
| 1674 | /** |
| 1675 | * Function type for a hook that intercepts class_getImageName(). |
| 1676 | * |
| 1677 | * @param cls The class whose image name is being looked up. |
| 1678 | * @param outImageName On return, the result of the image name lookup. |
| 1679 | * @return YES if an image name for this class was found, NO otherwise. |
| 1680 | * |
| 1681 | * @see class_getImageName |
| 1682 | * @see objc_setHook_getImageName |
| 1683 | */ |
| 1684 | typedef BOOL (*objc_hook_getImageName)(Class _Nonnull cls, const char * _Nullable * _Nonnull outImageName); |
| 1685 | |
| 1686 | /** |
| 1687 | * Install a hook for class_getImageName(). |
| 1688 | * |
| 1689 | * @param newValue The hook function to install. |
| 1690 | * @param outOldValue The address of a function pointer variable. On return, |
| 1691 | * the old hook function is stored in the variable. |
| 1692 | * |
| 1693 | * @note The store to *outOldValue is thread-safe: the variable will be |
| 1694 | * updated before class_getImageName() calls your new hook to read it, |
| 1695 | * even if your new hook is called from another thread before this |
| 1696 | * setter completes. |
| 1697 | * @note The first hook in the chain is the native implementation of |
| 1698 | * class_getImageName(). Your hook should call the previous hook for |
| 1699 | * classes that you do not recognize. |
| 1700 | * |
| 1701 | * @see class_getImageName |
| 1702 | * @see objc_hook_getImageName |
| 1703 | */ |
| 1704 | OBJC_EXPORT void objc_setHook_getImageName(objc_hook_getImageName _Nonnull newValue, |
| 1705 | objc_hook_getImageName _Nullable * _Nonnull outOldValue) |
| 1706 | OBJC_AVAILABLE(10.14, 12.0, 12.0, 5.0, 3.0); |
| 1707 | |
| 1708 | /** |
| 1709 | * Function type for a hook that assists objc_getClass() and related functions. |
| 1710 | * |
| 1711 | * @param name The class name to look up. |
| 1712 | * @param outClass On return, the result of the class lookup. |
| 1713 | * @return YES if a class with this name was found, NO otherwise. |
| 1714 | * |
| 1715 | * @see objc_getClass |
| 1716 | * @see objc_setHook_getClass |
| 1717 | */ |
| 1718 | typedef BOOL (*objc_hook_getClass)(const char * _Nonnull name, Class _Nullable * _Nonnull outClass); |
| 1719 | |
| 1720 | /** |
| 1721 | * Install a hook for objc_getClass() and related functions. |
| 1722 | * |
| 1723 | * @param newValue The hook function to install. |
| 1724 | * @param outOldValue The address of a function pointer variable. On return, |
| 1725 | * the old hook function is stored in the variable. |
| 1726 | * |
| 1727 | * @note The store to *outOldValue is thread-safe: the variable will be |
| 1728 | * updated before objc_getClass() calls your new hook to read it, |
| 1729 | * even if your new hook is called from another thread before this |
| 1730 | * setter completes. |
| 1731 | * @note Your hook should call the previous hook for class names |
| 1732 | * that you do not recognize. |
| 1733 | * |
| 1734 | * @see objc_getClass |
| 1735 | * @see objc_hook_getClass |
| 1736 | */ |
| 1737 | #if !(TARGET_OS_OSX && __i386__) |
| 1738 | #define OBJC_GETCLASSHOOK_DEFINED 1 |
| 1739 | OBJC_EXPORT void objc_setHook_getClass(objc_hook_getClass _Nonnull newValue, |
| 1740 | objc_hook_getClass _Nullable * _Nonnull outOldValue) |
| 1741 | OBJC_AVAILABLE(10.14.4, 12.2, 12.2, 5.2, 3.2); |
| 1742 | #endif |
| 1743 | |
| 1744 | /** |
| 1745 | * Function type for a function that is called when an image is loaded. |
| 1746 | * |
| 1747 | * @param header The newly loaded header. |
| 1748 | */ |
| 1749 | typedef void (*objc_func_loadImage)(const struct mach_header * _Nonnull header); |
| 1750 | |
| 1751 | /** |
| 1752 | * Add a function to be called when a new image is loaded. The function is |
| 1753 | * called after ObjC has scanned and fixed up the image. It is called |
| 1754 | * BEFORE +load methods are invoked. |
| 1755 | * |
| 1756 | * When adding a new function, that function is immediately called with all |
| 1757 | * images that are currently loaded. It is then called as needed for images |
| 1758 | * that are loaded afterwards. |
| 1759 | * |
| 1760 | * Note: the function is called with ObjC's internal runtime lock held. |
| 1761 | * Be VERY careful with what the function does to avoid deadlocks or |
| 1762 | * poor performance. |
| 1763 | * |
| 1764 | * @param func The function to add. |
| 1765 | */ |
| 1766 | #define OBJC_ADDLOADIMAGEFUNC_DEFINED 1 |
| 1767 | OBJC_EXPORT void objc_addLoadImageFunc(objc_func_loadImage _Nonnull func) |
| 1768 | OBJC_AVAILABLE(10.15, 13.0, 13.0, 6.0, 4.0); |
| 1769 | |
| 1770 | /** |
| 1771 | * Function type for a hook that provides a name for lazily named classes. |
| 1772 | * |
| 1773 | * @param cls The class to generate a name for. |
| 1774 | * @return The name of the class, or NULL if the name isn't known or can't me generated. |
| 1775 | * |
| 1776 | * @see objc_setHook_lazyClassNamer |
| 1777 | */ |
| 1778 | typedef const char * _Nullable (*objc_hook_lazyClassNamer)(_Nonnull Class cls); |
| 1779 | |
| 1780 | /** |
| 1781 | * Install a hook to provide a name for lazily-named classes. |
| 1782 | * |
| 1783 | * @param newValue The hook function to install. |
| 1784 | * @param outOldValue The address of a function pointer variable. On return, |
| 1785 | * the old hook function is stored in the variable. |
| 1786 | * |
| 1787 | * @note The store to *outOldValue is thread-safe: the variable will be |
| 1788 | * updated before objc_getClass() calls your new hook to read it, |
| 1789 | * even if your new hook is called from another thread before this |
| 1790 | * setter completes. |
| 1791 | * @note Your hook must call the previous hook for class names |
| 1792 | * that you do not recognize. |
| 1793 | */ |
| 1794 | #if !(TARGET_OS_OSX && __i386__) |
| 1795 | #define OBJC_SETHOOK_LAZYCLASSNAMER_DEFINED 1 |
| 1796 | OBJC_EXPORT |
| 1797 | void objc_setHook_lazyClassNamer(_Nonnull objc_hook_lazyClassNamer newValue, |
| 1798 | _Nonnull objc_hook_lazyClassNamer * _Nonnull oldOutValue) |
| 1799 | OBJC_AVAILABLE(11.0, 14.0, 14.0, 7.0, 5.0); |
| 1800 | #endif |
| 1801 | |
| 1802 | /** |
| 1803 | * Callback from Objective-C to Swift to perform Swift class initialization. |
| 1804 | */ |
| 1805 | #if !(TARGET_OS_OSX && __i386__) |
| 1806 | typedef Class _Nullable |
| 1807 | (*_objc_swiftMetadataInitializer)(Class _Nonnull cls, void * _Nullable arg); |
| 1808 | #endif |
| 1809 | |
| 1810 | |
| 1811 | /** |
| 1812 | * Perform Objective-C initialization of a Swift class. |
| 1813 | * Do not call this function. It is provided for the Swift runtime's use only |
| 1814 | * and will change without notice or mercy. |
| 1815 | */ |
| 1816 | #if !(TARGET_OS_OSX && __i386__) |
| 1817 | #define OBJC_REALIZECLASSFROMSWIFT_DEFINED 1 |
| 1818 | OBJC_EXPORT Class _Nullable |
| 1819 | _objc_realizeClassFromSwift(Class _Nullable cls, void * _Nullable previously) |
| 1820 | OBJC_AVAILABLE(10.14.4, 12.2, 12.2, 5.2, 3.2); |
| 1821 | #endif |
| 1822 | |
| 1823 | // Type encoding characters |
| 1824 | #define _C_ID '@' |
| 1825 | #define _C_CLASS '#' |
| 1826 | #define _C_SEL ':' |
| 1827 | #define _C_CHR 'c' |
| 1828 | #define _C_UCHR 'C' |
| 1829 | #define _C_SHT 's' |
| 1830 | #define _C_USHT 'S' |
| 1831 | #define _C_INT 'i' |
| 1832 | #define _C_UINT 'I' |
| 1833 | #define _C_LNG 'l' |
| 1834 | #define _C_ULNG 'L' |
| 1835 | #define _C_LNG_LNG 'q' |
| 1836 | #define _C_ULNG_LNG 'Q' |
| 1837 | #define _C_INT128 't' |
| 1838 | #define _C_UINT128 'T' |
| 1839 | #define _C_FLT 'f' |
| 1840 | #define _C_DBL 'd' |
| 1841 | #define _C_LNG_DBL 'D' |
| 1842 | #define _C_BFLD 'b' |
| 1843 | #define _C_BOOL 'B' |
| 1844 | #define _C_VOID 'v' |
| 1845 | #define _C_UNDEF '?' |
| 1846 | #define _C_PTR '^' |
| 1847 | #define _C_CHARPTR '*' |
| 1848 | #define _C_ATOM '%' |
| 1849 | #define _C_ARY_B '[' |
| 1850 | #define _C_ARY_E ']' |
| 1851 | #define _C_UNION_B '(' |
| 1852 | #define _C_UNION_E ')' |
| 1853 | #define _C_STRUCT_B '{' |
| 1854 | #define _C_STRUCT_E '}' |
| 1855 | #define _C_VECTOR '!' |
| 1856 | |
| 1857 | // Modifiers |
| 1858 | #define _C_COMPLEX 'j' |
| 1859 | #define _C_ATOMIC 'A' |
| 1860 | #define _C_CONST 'r' |
| 1861 | #define _C_IN 'n' |
| 1862 | #define _C_INOUT 'N' |
| 1863 | #define _C_OUT 'o' |
| 1864 | #define _C_BYCOPY 'O' |
| 1865 | #define _C_BYREF 'R' |
| 1866 | #define _C_ONEWAY 'V' |
| 1867 | #define _C_GNUREGISTER '+' |
| 1868 | |
| 1869 | struct objc_method_list; |
| 1870 | |
| 1871 | /* Used for testing only */ |
| 1872 | |
| 1873 | OBJC_EXPORT void |
| 1874 | _objc_flush_caches(Class _Nullable cls) |
| 1875 | __OSX_DEPRECATED(10.0, 10.5, "not recommended") |
| 1876 | __IOS_DEPRECATED(2.0, 2.0, "not recommended") |
| 1877 | __TVOS_DEPRECATED(9.0, 9.0, "not recommended") |
| 1878 | __WATCHOS_DEPRECATED(1.0, 1.0, "not recommended") |
| 1879 | |
| 1880 | ; |
| 1881 | |
| 1882 | /* Obsolete functions */ |
| 1883 | |
| 1884 | #if !0 |
| 1885 | |
| 1886 | OBJC_EXPORT IMP _Nullable |
| 1887 | class_lookupMethod(Class _Nullable cls, SEL _Nonnull sel) |
| 1888 | __OSX_DEPRECATED(10.0, 10.5, "use class_getMethodImplementation instead") |
| 1889 | __IOS_DEPRECATED(2.0, 2.0, "use class_getMethodImplementation instead") |
| 1890 | __TVOS_DEPRECATED(9.0, 9.0, "use class_getMethodImplementation instead") |
| 1891 | __WATCHOS_DEPRECATED(1.0, 1.0, "use class_getMethodImplementation instead") |
| 1892 | |
| 1893 | ; |
| 1894 | OBJC_EXPORT BOOL |
| 1895 | class_respondsToMethod(Class _Nullable cls, SEL _Nonnull sel) |
| 1896 | __OSX_DEPRECATED(10.0, 10.5, "use class_respondsToSelector instead") |
| 1897 | __IOS_DEPRECATED(2.0, 2.0, "use class_respondsToSelector instead") |
| 1898 | __TVOS_DEPRECATED(9.0, 9.0, "use class_respondsToSelector instead") |
| 1899 | __WATCHOS_DEPRECATED(1.0, 1.0, "use class_respondsToSelector instead") |
| 1900 | |
| 1901 | ; |
| 1902 | |
| 1903 | OBJC_EXPORT id _Nullable |
| 1904 | object_copyFromZone(id _Nullable anObject, size_t nBytes, void * _Nullable zone __unused) |
| 1905 | OBJC_OSX_DEPRECATED_OTHERS_UNAVAILABLE(10.0, 10.5, "use object_copy instead"); |
| 1906 | |
| 1907 | OBJC_EXPORT id _Nullable |
| 1908 | class_createInstanceFromZone(Class _Nullable, size_t idxIvars, |
| 1909 | void * _Nullable zone __unused) |
| 1910 | OBJC_OSX_DEPRECATED_OTHERS_UNAVAILABLE(10.0, 10.5, "use class_createInstance instead"); |
| 1911 | |
| 1912 | #endif |
| 1913 | |
| 1914 | #endif |