2016-11-11 11 views
0

でのNSLogとNSCFString objectAtIndexedSubscriptを取得する私は、このメソッドを使用して私のアプリを終了していると私は実装しています最後の呼び出しは、私が解析する必要が簡単なJSON応答であり、それは私を与えている:cellForRowAtIndexPath

[ __NSCFString objectAtIndexedSubscriptは:]:認識されていないセレクタのインスタンス0x17005caa0' に

を を送っこのウェブサイト上でこのようなsmililar質問がたくさんありますが、それらはまったく運を指示していないが、それでも、私はすべてをやっています。
これはresponseObjectのネストされたJSONです。私は、送信しているリクエストが正しいことを意味するresponseObjectを取得しています。

[[manager dataTaskWithRequest:req completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error){ 
     if (!error) { 
      if (response) { 
       allResponse = [[NSMutableArray alloc] init]; 
       allPractice = [[NSMutableArray alloc] init]; 
       allProvider = [[NSMutableArray alloc] init]; 

       allFirstName = [[NSMutableArray alloc] init]; 
       allMiddleName = [[NSMutableArray alloc] init]; 
       allLastName = [[NSMutableArray alloc] init]; 
       allPracticeName = [[NSMutableArray alloc] init]; 

       allResponse = responseObject; 
       allPractice = [allResponse valueForKey:@"Practice"]; 
       allProvider = [allResponse valueForKey:@"Provider"]; 

       allFirstName = [allProvider valueForKey:@"FirstName"]; 
       allMiddleName = [allProvider valueForKey:@"MiddleName"]; 
       allLastName = [allProvider valueForKey:@"LastName"]; 
       allPracticeName = [allPractice valueForKey:@"PracticeAlias"]; 

       [self.tableView reloadData]; 
       [SVProgressHUD dismiss]; 

      }} 

これは、ResponseObjectとして取得している構造です。

cellForRowAtIndexPath中のSO
{ 
    AccountType = 2; 
    CreatedBy = smith; 
    CreatedDate = "2016-01-25T02:07:42.45"; 
    DisplayName = ", "; 
    Email = "<null>"; 
    ErrorMessage = "<null>"; 
    FirstName = "<null>"; 
    ID = 1; 
    IsActive = 1; 
    Password = test; 
    Phone = "<null>"; 
    Practice =  { 
PracticeAlias = “SAMPLE MEDICAL GROUP"; 
}; 
    PracticeAlias = "<null>"; 
    PracticeCode = "<null>"; 
    PracticeID = 1; 
Provider =  { 
    AccountType = 0; 
    CreatedBy = smith; 
    LastName = John; 
    MiddleName = ""; 
    FirstName = Smith; 
}; 
    Staff = "<null>"; 
    lstPractice = "<null>"; 
    lstProvider = "<null>"; 
    pageSize = 0; 
} 

私はこれを実行します。私は上記の共有メッセージと

NSLog(@"%@", [NSString stringWithFormat:@"%@",allPracticeName[indexPath.row]]); 

アプリがクラッシュします。

答えて

1

allPracticeNameは、タイプがNSString(値が "< null")です。あなたは、この文字列に添字演算子[]を呼び出している:

allPracticeName[indexPath.row] 

しかしNSStringには添字の実装を持っていません。二行

  allResponse = [[NSMutableArray alloc] init]; 
      allResponse = responseObject; 

のナンセンスで

NSLog(allPracticeName); 
+0

"< null >"をヌルの代わりに文字列値として送信することは非常に奇妙です。おそらく彼らの開発者は[NSNull null]をチェックすることができませんでした。 – gnasher729

2

ルック:

は添字を削除します。 allResponseを新しく作成した可変配列に設定し、それをresponseObjectで置き換えます。そして、何もチェックはありません。予期しないデータがあれば、アプリがクラッシュする可能性があります。

あなたはresponseObjectをNSDictionary *にして、それが本当にNSDictionary *であることを確認する必要があります。あなたがresponseObject [@ "Practice"]を使うのではなく、なぜそうするのかという理由がない限り、valueForKeyを使わないでください。これらのタイプもチェックしてください。

+0

hmmm ...このアドバイスをありがとう私は私のアプリでそれを修正することを確認します:) –

+0

@ TalhaCh - 割り当てられる値の種類に関係なく、すべての変数の新しい配列を割り当て、これらの無意味な配列をすべて破棄します。これが一般的なコーディング手法である場合は、* whole *アプリをチェックする必要があります。 – CRD

関連する問題