How to deprecate a method in Objective-C
We have our library we ship to our customers, and I'd like to mark some meth开发者_开发百科ods as "deprecated" because we changed them (like Apple does in the iPhone SDK).
I've seen the __OSX_AVAILABLE_BUT_DEPRECATED
pre-processor macro, which is mapped to __AVAILABILITY_INTERNAL
, which is mapped to __attribute__((deprecated))
...
Well i'm a bit confused with this stuff!
Anybody knows something about that ?
__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
If you are using C++14 in your xcode project, you may also use the [[deprecated]]
or [[deprecated("reason")]]
attribute that is now part of the language.
see documentation: http://en.cppreference.com/w/cpp/language/attributes
- FOR SWIFT CODE:
Put this right above the method:
@available(*, deprecated: <#Version#>, message: <#Message#>)
example:
@available(*, deprecated: 11, message: "Use color assets instead")
public struct ColorPaletteItemResource: ColorPaletteItemResourceType {
...
}
精彩评论