smellman's Broken Diary

クソみたいなもんです

Objective-Cでdeprecatedなclassやmethodを定義する

自分用メモです。
deprecatedなやつってよくiOS SDKが上がったりするとでてきますけど、自分で定義する方法を知らなかったので調べてみた。
まずこんな定義があったとします。

@interface Anal : NSObject
- (Unko *) dappun;
- (void *) senjou:(Water *) _water;
@end

アナルから脱糞するとうんこが出てくるという非常にわかりやすいクラスです。アナルを水で綺麗にするというウォシュレットっぽいのにも対応しています。これならベトナム式のウォシュレットでも対応できますね。お湯で洗うとしてもHot Waterなインスタンスを渡してあげればいいでしょう。
では、そもそもアナルクラスなんて使わねーよクソが!ってなった時はこんなふうに書きます。

__attribute__ ((deprecated))
@interface Anal : NSObject
- (Unko *) dappun;
- (void *) senjou:(Water *) _water;
@end

__attribute__ ((deprecated)) というのがキーワードです。
これでアナルクラスを使おうとするとメッセージが出てくるようになります。
では、次に脱糞ってなんだよアナルが英語だったらdo_a_pooだろクソが!ってなった場合に、もしかすると脱糞し続けてるインスタンスがあるかもしれないのでこのメソッドをdeprecatedにしてみます。

@interface Anal : NSObject
- (Unko *) do_a_poo;
- (Unko *) dappun __attribute__ ((deprecated));
- (void *) senjou:(Water *) _water;
@end

これで脱糞し続けてるインスタンスがあっても生きて行けます。
では、俺は紙派だ!という人がウォシュレットの存在を否定したらどうでしょう。という場合はこんな感じになります。

@interface Anal : NSObject
- (Unko *) dappun;
- (void *) senjou:(Water *) _water __attribute__ ((deprecated));
- (void *) senjou:(Paper *) _paper;
@end

引数があっても後ろに追加すればOKという感じです。
ぶっちゃけこれってObjective-C以外でも使えると思います。__attribute__というGCCの拡張機能ですね。
あと、アナルクラス書いてるやつたぶんいないと思います!