5

XCodeプロジェクトに2つのカテゴリがある場合:

@implementation NSData (test1)
- (void) testData {
     NSLog(@"test data 1");
} 
@end

@implementation NSData (test2)
- (void) testData {
     NSLog(@"test data 2");
} 
@end

これに対して期待される出力は何ですか:

NSData* testData = [[NSData alloc] init];
[testData testData];

私が得ている出力は常にです

#import "NSData+test1.h"

これについて何か説明はありますか?最初のカテゴリを強制する方法はありますか?

ここでの問題は、同じ名前のカテゴリを持つ静的ライブラリを使用して2つのSDKをインポートする場合、どのように問題を回避するかということです。SDK作成者にメソッド名のプレフィックスを使用するように依頼するのが唯一の方法だと思いますか?

4

1 に答える 1

16

動作は未定義であり、回避する必要があります。関連するドキュメントは次のとおりです。

カテゴリメソッド名の衝突を避ける

カテゴリで宣言されたメソッドは既存のクラスに追加されるため、メソッド名には十分注意する必要があります。

カテゴリで宣言されたメソッドの名前が元のクラスのメソッド、または同じクラス(またはスーパークラス)の別のカテゴリのメソッドと同じである場合、どのメソッド実装がで使用されるかについての動作は定義されていません。ランタイム。独自のクラスでカテゴリを使用している場合、これが問題になる可能性は低くなりますが、カテゴリを使用して標準のCocoaまたはCocoaTouchクラスにメソッドを追加するときに問題が発生する可能性があります。

于 2013-03-15T02:30:26.887 に答える