How to deprecate a method in Xcode How to deprecate a method in Xcode xcode xcode

How to deprecate a method in Xcode


__attribute__((deprecated)) is the gcc way (also supported in clang) of marking a function / method as deprecated. When one is marked as "deprecated", a warning will be produced whenever anyone calls it.

The syntax for normal functions would be

__attribute__((deprecated))void f(...) {  ...}// gcc 4.5+ / clang__attribute__((deprecated("g has been deprecated please use g2 instead")))void g(...) {  ...}

and that of Objective-C methods would be

@interface MyClass : NSObject { ... }-(void)f:(id)x __attribute__((deprecated));...@end

You can also mark the whole class as deprecated with

__attribute__((deprecated))@interface DeprecatedClass : NSObject { ... }...@end

Apple also provides the <AvailabilityMacros.h> header which provides the DEPRECATED_ATTRIBUTE and DEPRECATED_MSG_ATTRIBUTE(msg) macros that expand to the above attributes, or nothing if the compiler doesn't support attributes. Note that this header doesn't exist outside of OS X / iOS.


Side note, if you are using Swift you use the @available attribute to deprecate an item, e.g.

@available(*, deprecated=2.0, message="no longer needed")func f() {    ...}


You can also use more readable define DEPRECATED_ATTRIBUTE

It defined in usr/include/AvailabilityMacros.h:

#define DEPRECATED_ATTRIBUTE        __attribute__((deprecated))#define DEPRECATED_MSG_ATTRIBUTE(msg) __attribute((deprecated((msg))))

Objective-C methods example:

@interface MyClass : NSObject { ... }-(void)foo:(id)x DEPRECATED_ATTRIBUTE;// If you want to specify deprecated message:-(void)bar:(id)x DEPRECATED_MSG_ATTRIBUTE("Use baz: method instead.");...@end

You can also mark the whole class as deprecated:

DEPRECATED_ATTRIBUTE@interface DeprecatedClass : NSObject { ... }...@end


Swift 5.0

Deprecate any method/class/struct/protocols using @available

@available(*, deprecated, message: "Parse your data by hand instead")func parseData() { }@available(*, deprecated, renamed: "loadData")func fetchData() { }@available(swift, obsoleted: 4.1, renamed: "attemptConnection")func testConnection() { }@available(swift, deprecated: 4.0, obsoleted: 5.0, message: "This will be removed in v5.0; please migrate to a different API.")

Possible params:

  • introduced
  • deprecated
  • obsoleted
  • message
  • renamed

For more info see apple doc: Attributes