2016-04-18 7 views
0

私はクラッシュログNSObjectをBOOLプロパティに設定するときに例外が発生することはありますか?

-[__NSCFConstantString charValue]: unrecognized selector sent to instance 0x8224d0 

を受けるので、私は、コードをチェックし、それが

[self setValue:value forKeyPath:key]; 

によって引き起こされます見つけるが、私は手動でBOOLプロパティにNSStringのを設定したとき、私はこのクラッシュを再び現れることはできません。

本当にクラッシュするのですか?

プロパティを設定する前にタイプをチェックしますが、この問題が修正されたかどうかはわかりません。

-(instancetype)initWithDic:(NSDictionary *)dic 
{ 
    self = [super init]; 
    if(self) 
    { 
     if(![dic isKindOfClass:[NSDictionary class]]) 
      return self; 

     //now I do sth,funtion "propertyOfClass" will not return the BOOL-type properties 

     NSArray *properties = [Utils propertyOfClass:[self class]]; 

     for(NSString *key in properties) 
     { 
      NSString *value = GET_STRING(dic[key]); 

      if (![value isEqualToString:@""]) { 
       [self setValue:value forKeyPath:key]; 
      } 
     } 

    } 

    return self; 
} 

そして今、私はコード

@interface ClassA : NSObject 
@property (nonatomic, assign) BOOL propertyA; 
@end 

ClassA *a = [ClassA new]; 

[a setValue:@"xx" forKey:@"propertyA"]; 
[a setValue:@"" forKeyPath:@"propertyA"]; 
+0

これは非常に混乱しやすい質問ですが、実際のクラッシュです。はい、また再び発生します。 – trojanfoe

答えて

0

単純な答えでこのクラッシュを再表示されしようとしている:はい

は、コードを更新しました。

[NSObject setValue:forKeyPath:]を呼び出すときは、オブジェクトvalueのタイプが定義したプロパティのタイプと一致していることを確認する必要があります。

あなたの場合、クラッシュは、そのメソッドを知らないオブジェクトに対してメソッドを呼び出しているように見えることに注意してください。これが「認識できないセレクタがインスタンス0x8224d0に送信したもの」です。あなたが渡しているkeyはNSStringではないと思います。

+0

'NSString'には' charValue'メソッドがありません。問題は、メッセージ*が文字列に送られていることです。 – Avi

+0

私は 'key'と' value'の両方が 'NSString'であると確信していますが、本当に私がなぜクラッシュを再現できないのか混乱させてしまいます:( – Rick

+0

クラッシュを再現しようとしているコードは何ですか? – dirkgroten

関連する問題