Есть ли простой способ запретить какой-либо метод из фреймворка? - PullRequest
1 голос
/ 10 февраля 2012

Я хочу запретить какой-то метод. Например

+ (MPMusicPlayerController*)iPodMusicPlayer

поэтому я попытался сделать это:

@interface MPMusicPlayerController (Disallowed)
// do never this method cause issues #957 #632 #1463
// read #632 description to detail analysis why code should never use this method while
// applicationMusicPlayer is used
+ (MPMusicPlayerController*)iPodMusicPlayer __attribute__((unavailable));
+ (MPMusicPlayerController*)iPodMusicPlayer __attribute__((deprecated));
@end

но код ниже скомпилирован в любом случае без предупреждения

MPMusicPlayerController * curPlayer = [MPMusicPlayerController iPodMusicPlayer];

Есть мысли?

Ответы [ 2 ]

2 голосов
/ 26 декабря 2013

Время компиляции:

В одну сторону, просто используйте следующий код:

#pragma GCC poison iPodMusicPlayer

Я должен упомянуть, что SDK61 и SDK7 не могут «отравить» селектор, который содержит «:» причина ошибка llvm : (

по-другому:

#import <MediaPlayer/MediaPlayer.h> // import original methods at first
@interface MPMusicPlayerController (Disallowed)
+ (MPMusicPlayerController*)disallowedMethod_iPodMusicPlayer __attribute__((unavailable));
@end

#define iPodMusicPlayer disallowedMethod_iPodMusicPlayer
1 голос
/ 10 февраля 2012

Я думаю, вы можете создать категорию на MPMusicPlayerController, например, Переопределите (MPMusicPlayerController + Override), затем переопределите метод класса iPodMusicPlayer, чтобы вернуть ноль. Обязательно #include MPMusicPlayerController + Override.h.

Вы можете добавить предупреждающий знак к вашему методу, чтобы напомнить всем, кто не должен его использовать:

#warning Disabled method - do not use.

Пожалуйста, дайте мне знать, если это работает для вас.

Дэмиен

...