あなたが遭遇した問題の鍵は、Objective-C のポリモーフィズムに関する微妙な点にあります。この言語はメソッドのオーバーロードをサポートしていないため、メソッド名は特定のクラス内のメソッドを一意に識別するものと見なされます。オーバーライドされたメソッドは、それがオーバーライドするメソッドと同じセマンティクスを持つという暗黙の (しかし重要な) 仮定があります。
あなたが与えた場合、おそらく2つのメソッドのセマンティクスは同じではありません。つまり、最初のメソッドはレシーバーのコンテンツの「削除された」バージョンで初期化された新しい文字列を返しますが、2 番目のメソッドはレシーバーのコンテンツを直接変更します。これら 2 つの操作は実際には同等ではありません。
Apple が API に名前を付ける方法、特に Foundation を詳しく見てみると、セマンティックなニュアンスを明らかにするのに役立つと思います。たとえば、NSString には、変更されたバージョンのレシーバーを含む新しい文字列を作成するためのメソッドがいくつかあります。
- (NSString *)stringByAppendingFormat:(NSString *)format ...;
名前は名詞であることに注意してください。最初の単語は戻り値を表し、名前の残りの部分は引数を表します。これを、レシーバーに直接追加するための NSMutableString の対応するメソッドと比較します。
- (void)appendFormat:(NSString *)format ...;
対照的に、このメソッドは、説明する戻り値がないため、動詞です。-appendFormat: がレシーバーに作用するのに対し、 -stringByAppendingFormat: は作用せず、代わりに新しい文字列を返すことは、メソッド名だけから明らかです。
(ちなみに、 NSString には、必要なことの少なくとも一部を実行するメソッドが既にあります。引数として-stringByTrimmingCharactersInSet:
渡しwhitespaceCharacterSet
て、先頭と末尾の空白を削除できます。)
そのため、最初は面倒に思えるかもしれませんが、長い目で見れば、Apple の命名規則をエミュレートしようとする価値があることがわかると思います。他に何もないとしても、特に他の Obj-C 開発者にとって、コードをより自己文書化するのに役立ちます。しかし、Objective-C と Apple のフレームワークのセマンティック上の機微を明確にするのにも役立つと思います。
また、クラス クラスタの内部の詳細が当惑する可能性があることに同意します。特に、それらはほとんど不透明であるためです。ただし、NSString は可変インスタンスと不変インスタンスの両方に NSCFString を使用するクラス クラスターであるという事実は変わりません。したがって、2 番目のカテゴリが別のメソッドを追加すると、最初のカテゴリによって追加されたメソッド-strip
が置き換えられます。-strip
1 つまたは両方のメソッドの名前を変更すると、この問題が解消されます。
また、同じ機能を提供するメソッドが NSString に既に存在するため、変更可能なメソッドを追加するだけで間違いありません。理想的には、その名前は既存のメソッドと一致するため、次のようになります。
- (void)trimCharactersInSet:(NSCharacterSet *)set