0

私は、アプリケーションデリゲート()とカテゴリ(および何もしないデフォルトウィンドウ)で構成される単純なCocoaアプリケーション(39 KB圧縮)を持っています。AppDelegateNSString

そのinitメソッドでは、はAppDelegateを作成しNSSavePanelます。これを行う前後に、NSStringカテゴリメソッドによって空白と改行がトリミングされた文字列の長さをログに記録しますstringByTrimmingWhitespace

文字列は、空白文字と改行文字で構成されます。私のcategoryメソッドは、これらすべての文字をトリミングして、長さが0の文字列になるようにする必要があります。

NSSavePanelが作成される前に、私のstringByTrimmingWhitespaceメソッドが呼び出され、期待どおりに長さ0の文字列が返されます。NSSavePanelが作成された後、私のstringByTrimmingWhitespaceメソッドは呼び出されていないように見え、呼び出されたメソッドは新しい行をトリミングしません。ただし、NSStringまったく同じことを行う別のカテゴリメソッド(<code> stringByTrimmingWhitespaceAndNewlines)が呼び出され、期待どおりに機能します。

何が原因stringByTrimmingWhitespaceで呼び出されないのか、またはそれを修正する方法がまったくわかりません(名前を変更する以外に、これは私が行ったことです)。また、他のクラスの他のカテゴリメソッドがゴミ箱に入れられるのではないかと心配しています。ここで何が起こっているのか誰か知っていますか?

4

1 に答える 1

6

NSSavePanel名前がメソッドと競合するメソッドを使用して、NSStringにカテゴリをロードして独自に使用しているようです-[NSString(TurnerAdditions) stringByTrimmingWhitespace]。次のコードで確認できます。

NSString *foo = @"!";
NSLog(@"Responds to '-stringByTrimmingWhitespace': %@", [foo respondsToSelector:@selector(stringByTrimmingWhitespace)] ? @"YES" : @"NO");
NSSavePanel *panel = [NSSavePanel savePanel];
NSLog(@"Responds to '-stringByTrimmingWhitespace': %@", [foo respondsToSelector:@selector(stringByTrimmingWhitespace)] ? @"YES" : @"NO");

なぜそれがあなたのものと同じように振る舞わないのかは少し奇妙です(編集:いいえ、そうではありません、@ rdelmarのコメントを参照してください)。

特にこのようなインスタンスの場合は、常にカテゴリのメソッド名の前に付ける必要があります。Cocoaの命名規則はかなり明示的であるため、名前の競合が発生する可能性が非常に高くなります。カテゴリの処理方法(たとえば、知らないうちにアプリの実行中にロードされる可能性がある)のため、コンパイラが競合エラーを提供することは困難/不可能です。

于 2013-03-26T05:19:36.507 に答える