Julien Julien - 3 months ago 15
Objective-C Question

How to deprecate a method in Xcode

We have our library we ship to our customers, and I'd like to mark some methods 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 ?

Answer

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