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() {
...
}
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
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