2012-03-14 8 views
1

このコード実行中:NSDataの長クラッシュ

NSData *archivedSavedData = [[NSData alloc] init];  
archivedSavedData = [defaults objectForKey:@"listOfAccessNumbers"]; 
NSLog(@"archivedSavedData length is %d", [archivedSavedData length]); 

私はこのクラッシュエラー(最後の行)を取得しています接続されたデバイス上で実行されているのみ:これは「doesnの

[__NSCFArray length]: unrecognized selector sent to instance 0x2398a0 2012-03-13 20:25:33.088[7301:707] * Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFArray length]: unrecognized selector sent to instance 0x2398a0' * First throw call stack: (0x34dbc88f 0x361e3259 0x34dbfa9b 0x34dbe915 0x34d19650 0xccb1b 0x31e13e33 0x31e38629 0x31dfcd7d 0x31ebf4dd 0x31e0555d 0x31e05579 0x31e0540b 0x31e053e7 0xcfedf 0x31e12e53 0x31e0c985 0x31ddac6b 0x31dda70f 0x31dda0e3 0x3600f22b 0x34d90523 0x34d904c5 0x34d8f313 0x34d124a5 0x34d1236d 0x31e0ba13 0x31e08e7d 0xcfd39 0xcbe28) terminate called throwing an exception

をシミュレータ上で実行されているとき、または分布プロファイルを持つデバイス上で直接実行されている場合(testflightなど)

どのようにこのような現象がこの場合にのみ起こるか知っていますか?

ありがとうございました。

UPDATE:数と長さを交換しようとしたとき、私はこの合併症のエラーを取得:

アップデート2「『NSDataの』の目に見える@interfaceは、セレクタ 『回数』を宣言していない」:私はそれはかなりNSArrayのでなければならないことを理解します私の問題は、私の配列はカスタムオブジェクトで構成されているため、NSData形式にNSData形式で保存する必要があったためです。それ以外の方法はどうすればいいですか?

私はデータを格納する方法厥:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array]; 
    [defaults setObject:data forKey:@"listOfAccessNumbers"]; 

配列は、の形のカスタムオブジェクトの配列です:

@interface NumberDataObj : NSObject { 

    NSString *inputName; 
    NSString *inputNum; 

} 
+0

1.はい、ARCが有効になっています2.私はこれを1行で行うことができますが、まだ宣言する必要があります...いいえ? – TommyG

+0

問題は明らかに変数がNSDataとして宣言されていますが、変数に格納されているポインタはNSArrayです。これはNSArrayを変数に代入する "ダム"の間違いかもしれません。あるいは、何らかのストレージ管理の問題かもしれません(ARCを使わないで、別のものに変わります)。 –

+0

オブジェクトの最下位に到達するためには、オブジェクトをシリアル化する場所を確認する必要があります。 – FluffulousChimp

答えて

3

エラーメッセージは言う:

-[__NSCFArray length]: unrecognized selector sent to instance 

ことarchivedSavedDataが配列であり、(明らかに)lengthに応答しないことを意味しますarchivedSavedDataを配列として宣言し、代わりにcountを使用する必要があります。今

NSArray *archivedSavedData = [defaults objectForKey:@"listOfAccessNumbers"]; 
NSLog(@"archivedSavedData length is %d", [archivedSavedData count]); 

、シミュレータ上で実行しているときにこの現象が発生しない理由として、私の推測では、あなたのテストシナリオは、コードのこの部分が呼び出されることはありませんということです。

EDIT

あなたはNSDataとしてデータを取得したい場合は、ドキュメントがdataForKeyのために言う方法dataForKey:

NSData *archivedSavedData = [defaults dataForKey:@"listOfAccessNumbers"]; 
NSLog(@"archivedSavedData length is %d", [archivedSavedData length]); 

を使用します。

Return Value The data object associated with the specified key, or nil if the key does not exist or its value is not an NSData object.

arrayForkeyのために:あなたはデータの種類を知っているとき

Return Value The array associated with the specified key, or nil if the key does not exist or its value is not an NSArray object.

ので遠かっこのような問題を回避するために、適切なメソッドを使用します。

1)あなたは解除せずに次の行に再割り当てarchivedSavedDataという変数を割り当てる:

+0

あなたは何かにいると思います...今チェックしてください。 – TommyG

+0

はい、あります!ありがとうございます+1 – TommyG

2

あなたはコードが書かれているように2つの問題を抱えています。 ARCで作業している場合はこれで問題はありませんが、最初の行は不要です。

2)2番目の問題は、defaultsオブジェクトに格納されているkey @ "listOfAccessNumbers"に対応するオブジェクトがNSArray型であることです。 NSArrayは長さではなくセレクタカウントに応答します。おそらく、このオブジェクトをより詳しく見てそれに応じてコードを書き直すべきでしょう。

・ホープこのことができます:)

+0

私はARCで作業しています。なぜなら、これはカスタムオブジェクトの配列なのでNSDataを使用する理由です。アーカイブを使用したときに、アーカイブの使用方法がわからない... – TommyG

2

[defaults objectForKey:@"listOfAccessNumbers"]NSArray、ないNSDataオブジェクトを返すためです。

+0

上記の私の更新をご覧ください – TommyG