43

How do I flag a function as being deprecated in an iOS Objective-C header file?

I'm guessing there's just some keyword I can stick after the function somewhere?

I would like for a compiler warning to be generated should anyone try and use the deprecated function, similar to the behavior seen in Apple's APIs.

Cœur
  • 37,241
  • 25
  • 195
  • 267
Nick Cartwright
  • 8,334
  • 15
  • 45
  • 56

5 Answers5

62

Try appending an attribute to your method declaration:

- (void)fooBar __attribute__ ((deprecated));

Taken from here.

Andrew
  • 567
  • 2
  • 5
  • 18
Tim
  • 59,527
  • 19
  • 156
  • 165
15

Instead of __attribute__((deprecated)), you can use use the macros defined in <cdefs.h>:

- (void)fooBar __deprecated;
// Or better:
- (void)fooBar __deprecated_msg("Use barFoo instead.");

Or you can use the macros defined in <AvailabilityMacros.h>:

- (void)fooBar DEPRECATED_ATTRIBUTE;
// Or better:
- (void)fooBar DEPRECATED_MSG_ATTRIBUTE("Use barFoo instead.");

If you use Objective-C, it makes no difference as you are going to use a modern compiler, so you can go for Apple short syntax __deprecated_msg(). But if you use C for cross-platform, then DEPRECATED_MSG_ATTRIBUTE() uses the optimal availability definitions (for instance, it supports GCC3.1).

Cœur
  • 37,241
  • 25
  • 195
  • 267
7

Tim's answer will actually produce a compiler warning; the other versions are merely comments which have no effect w.r.t. the compiler.

If you look at /usr/include/AvailabilityMacros.h, you'll see how Apple does this. That header uses __attribute__((deprecated)) and __attribute__((unavailable)) depending on whether the API is present but deprecated, or has actually been removed from the OS.

Chris Parker
  • 1,252
  • 8
  • 7
2

From Apple's SFAuthorization.h:

/*!
DEPRECATED: Use obtainWithRight:flags:error:
@method permitWithRight:flags:
@abstract Call permitWithRight to gain a right to have
          access to a privilege operation.
@param rightName The name of an authorization right.
@param flags Authorization flags.
*/
- (OSStatus)permitWithRight:(AuthorizationString)rightName
                      flags:(AuthorizationFlags)flags;

If you're not using an automated documentation builder I'd say something like this is enough:

- (void)doSomething;           /* DEPRECATED */
Georg Schölly
  • 124,188
  • 49
  • 220
  • 267
  • Thanks for the comment. If I use the 'permitWithRight' function in SFAuthorization, I get a compiler warning... Is there a way to add a deprecation flag to give compiler warnings? – Nick Cartwright Sep 18 '09 at 12:01
  • You could use the preprocessor's command #warning, but it's not standard and likely to not work in all compilers. See http://stackoverflow.com/questions/171435/portability-of-warning-preprocessor-directive – Georg Schölly Sep 18 '09 at 12:54
2

You could also follow the HeaderDoc manual. Where this syntax is used:

/*!
 * @abstract Foo is good for bar.
 *
 * @deprecated in version 2.0
 */
PeyloW
  • 36,742
  • 12
  • 80
  • 99