13

たとえば、テキストを垂直方向に揃えるためにUILabel呼び出されるメソッドまたはプロパティをサブクラス化して追加しました。 また、将来、SDK または iOS の次のバージョンで同じ名前のメソッドまたはプロパティが追加された場合、アプリがクラッシュしたり、予期しない動作をしたりする可能性があります。-verticalTextAlignment

※この問題は、サブクラス化ではなくカテゴリを使用しても発生します。

Question1
Objective-C でこの種の偶発的なオーバーライドを回避するにはどうすればよいですか?
のようにすべてのメソッドとプロパティにプレフィックスを付けることで、これを回避できると思います-XXX_verticalTextAlignment。でも現実的じゃないですよね?

質問
2 この種の偶発的なオーバーライドは、コンパイル時、または iOS SDK、OSX SDK、または XCode を更新するときに発生することを知っています。

しかし、iPhone の iOS バージョンをアップデートしたときにも起こる可能性はありますか?
たとえば、アプリが iOS5 では正常に動作するが、iOS6 での誤ったオーバーライドのために iOS6 では動作しない可能性はありますか?

4

4 に答える 4

5
  1. はい、独自のプレフィックスを使用できますが、それは一般的ではありません。

  2. はい、OS の更新後に発生する可能性があります。Objective-C は、他の言語のようにメッセージが呼び出されるのではなく、メソッドに送信される非常に動的な言語です。これらは、コンパイル時ではなく、実行時に解決されます。

要するに、そうです。将来の基本クラス メソッドを誤ってオーバーライドする可能性があります。唯一の解決策は、それが発生したときにそこにいて、メソッドの名前を変更することです。

于 2012-08-21T07:00:51.830 に答える
1

エレガントな解決策は、メソッドがすでに存在するかどうかを確認し、存在しない場合にのみ追加することです。MountainLionの条件付きカテゴリ

于 2012-08-21T07:25:59.783 に答える
1

カテゴリ メソッドにプレフィックスを付けることは、成長し続ける名前空間のないココア エコシステムでこれらの競合を回避する最も安全な方法です。

フレームワークの作成者、オープン ソースの開発者、およびその他の個々の開発者がクラス メソッドにプレフィックスを付ける必要があることは、非常に有効で合理的です。

多くの場合、私は自分の会社のイニシャルを前に付けたメソッドを作成し、そのメソッドを続けます。

- (void)JCMyMethodNamedSimilarToBaseClass;
于 2012-08-21T07:01:25.800 に答える
1

質問 1a カテゴリ

接頭辞を使用するか、混乱全体を避けて代わりに関数を使用してください。

質問 1b サブクラス メソッド

メソッドがスーパークラスでも実装できるほど一般的なことを行う場合、メソッド名に非標準の型名を指定するなど、Apple が従来選択するよりも少し「冗長」なメソッド名を選択するだけです。もちろん、これは衝突の可能性を減らすだけです。

より高いレベルのセキュリティが必要な場合は、実行時にこれをテストするだけで (いつ導入されるかがわかります)、すべてのユーザーが最新の状態に保たれることを期待できます。この問題はありません)。

質問2

しかし、iPhone の iOS バージョンをアップデートしたときにも起こる可能性はありますか?

はい。それほど珍しいことではありません。フレームワークが更新されると (ソフトウェアの更新などによって)、更新されたフレームワークが含まれる場合があります。このコードは objc ランタイムに読み込まれ、インストールされたフレームワークの objc 実装のバージョンを常に取得します。

また、コードやプラグインを非常に簡単に動的にロードできる OS X では、より広範な問題です。

于 2012-08-21T07:12:35.250 に答える