4

Objective-C は、既存のクラスにメソッドを追加できるサブクラス化とカテゴリをサポートしています。これが私のケースです。

// Made at earlier than iOS 5.x
@interface MyVC : UIViewController
- (void)childViewControllers;
@end

childViewControllersiOS 5.0以前はこの方法はありませんでした。気にせずにメソッドを追加できました。しかし、今UIViewControllerでは名前の付いたメソッドがあります。iOS 4.x 用に記述されたレガシー コードをビルドすると、メソッドがオーバーライドされ、予期しない結果が生じる可能性があります。

この種の問題からコードを守るテクニックはありますか? これは、カテゴリまたは (おそらく) 他の何かで発生する可能性があります。

4

2 に答える 2

6

1 つのオプションは、すべてのメソッド名にプレフィックスを追加することです。標準フレームワーク クラスを拡張するときはいつでも、これを行ってください。

Java のような名前空間がないため、これと同じ手法をクラス名に使用して、将来の衝突の可能性を回避します。

ここで、考慮すべきもう 1 つの考えがあります。これはどのくらいの頻度で発生しますか? メソッドの名前を元に戻して名前を変更し、影響を受けるコードを更新することで、めったに発生しない名前の衝突に対処しなければならない労力と、接頭辞の命名スキームを考え出し、それらの余分な文字を毎日何度も入力する労力を比較検討する必要があります。

于 2012-11-25T17:19:12.890 に答える
1

Obj-C などの遅延バインディング システムを扱う場合は、名前の競合に対する永遠の警戒が必要です。

残念ながら、これは常にこの種の問題の危険にさらされていることを意味します。この場合、4.x の時代には何も悪いことをしていません。あなたがしたことは、良いアイデアに良い名前を書いただけです! しかし、Apple もその名前を気に入っており、Apple の製品が常に優先されます。特に Apple のものを拡張する場合は、クラスとメソッドの名前に接頭辞を追加することをお勧めします。

この場合、メソッドの名前を変更するだけです。幸いなことに、モバイルの世界では、新しいアプリ バージョンを維持しながら、古いアプリ バージョンにパッチを適用する必要はありません。アプリのバージョンを常に 1 つだけ市場に出すことは合法です。つまり、v6.0.2 ではなく、v5.1.6 のアプリに変更を適用することを心配することなく、コード ベースに永続的な変更を加えることができます。ユーザーが更新すると、常に最新バージョンに更新されます。

と呼ばれる非常に重要なメソッドを持っていたときに私がしたように、あなたは難しい方法で経験を構築します (あなたは今それをやっています) description

于 2012-11-25T17:29:48.830 に答える