6

ARC が有効になっています。

タイプ SEL のプロパティを持つクラスがあります。@property SEL mySelector;

それは合成されます:@synthesize mySelector;

次に、KVC を使用して値を割り当てようとします。

SEL someSelector = @selector(doSomething:)
NSValue* someSelectorValue = [NSValue value:someSelector withObjCType:@encode(SEL)];
[target setValue:someSelectorValue forKey:@"mySelector"];

エラーメッセージが表示されます:

[<LACMyClass 0x101b04bc0> setValue:forUndefinedKey:]:
this class is not key value coding-compliant for the key mySelector.

これは明らかに真実ではありません - クラスは KVC 準拠であり、渡す値が気に入らないだけです。 のvoid*代わりにtype のプロパティを定義すると機能するように見えますSELが、それは私の要件を満たしていません。

を使用することに加えてvalue:withObjCType:、私も試しvalueWithBytes:objCType:てみましたvalueWithPointer:

誰か説明してくれませんか

  1. 何が起こっているのか、そして
  2. これを適切に行う方法は?
4

2 に答える 2

2

エラーは、クラスがキー mySelector に準拠していないことを伝えようとしています。

STAssertNoThrow([target setValue:nil forKey:@"mySelector"], nil);

も失敗するはずです。問題は、mySelectorボックス化されていないことSELです。


興味があったので、このテストを実行しました:

@interface KVCOnSELTester : NSObject
@property (assign, nonatomic) SEL mySelector;
@property (assign, nonatomic) int myInteger;
@end

@implementation KVCOnSELTester
@end

@implementation KVCOnSELTests

- (void)testKVCOnSEL
{
    KVCOnSELTester *target = [KVCOnSELTester new];

    STAssertNoThrow((target.myInteger = 1), nil);
    STAssertNoThrow([target setMyInteger:1], nil);
    STAssertNoThrow([target setValue:nil forKey:@"myInteger"], nil);

    STAssertNoThrow((target.mySelector = @selector(setUp)), nil);
    STAssertNoThrow([target setMySelector:@selector(setUp)], nil);
    STAssertNoThrow([target setValue:nil forKey:@"mySelector"], nil);
}

@end

STAssertNoThrow([target setValue:nil forKey:@"myInteger"], nil)投げた[target setValue:nil forKey:@"myInteger"] raised [<KVCOnSELTester 0x8a74840> setNilValueForKey]: could not set nil as the value for the key myInteger..

これは、nilが適切でないことを正しく示していますmyInteger

STAssertNoThrow([target setValue:nil forKey:@"mySelector"], nil)投げた[target setValue:nil forKey:@"mySelector"] raised [<KVCOnSELTester 0x8a74840> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key mySelector..

これは、以前に発生したエラーと同じです。SELはKVCではないと思います。これを調べてみましたが、どこにもありませんでした。

于 2013-08-30T23:38:43.547 に答える