2009-11-02 14 views
14

NSObjectNSDataに変換する際に問題があります。私はNSObjectを継承するクラスを持っています。NSObjectをNSDataに変換する

iは次のようにNSDataに、その特定のクラスのオブジェクトを変換しようとした:私はまた、追加した..

NSData *dataOnObject = [NSKeyedArchiver archivedDataWithRootObject:classObject]; 

それは-[classObject encodeWithCoder:]:未認識セレクタインスタンスに送信することを知らせる例外を与えます新しく作成された配列へのオブジェクトは、

NSMutableArray *wrapperedData = [NSMutableArray arrayWithObject: classObject]; 
NSData *dataOnObject = [NSKeyedArchiver archivedDataWithRootObject:value]; 

となりますが、まだ例外が出ています。

だから私はオブジェクトからバイトを抽出する必要がありますclassObject

任意の助けをいただければ幸いです

...

お返事を待っている...

答えて

5

することができます

7

あなたはencodeWithCoderを実装する必要がNSCodingプロトコルをサポートする唯一のアーカイブオブジェクト:上のカスタムクラスは、渡されたNSCoderを使用してすべての属性をシリアライズします。その属性にさらにカスタムクラスが含まれている場合は、encodeWithCoderも実装する必要があります。代わりに

NSData *dataOnObject = [NSKeyedArchiver archivedDataWithRootObject:classObject]; 

6

それは

NSData *dataOnObject = [[NSUserDefaults standardUserDefaults] objectForKey:@"someKey"]; 

する必要がありますしかし、それはすでに保存されていますのそれは、データ読み出しのためだけです。

[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:classObject] forKey:@"someKey"]; 

をそれだけではありません。あなたがたNSDataとしてオブジェクトを保存したいなら、あなたはこれを持っています。あなたのclassObjectは、NSCodingプロトコルを実装し、encodeWithCoder:とinitWithCoder:の2つのメソッドを持たなければなりません。なぜなら、それが動作するためにはNSオブジェクトではないからです。

+0

なぜこれがダウン表示されましたか?笑。 –

+1

(私はあなたにdownvoteをしなかった)おそらくそれはNSKeyedUnarchiverがNSUserDefaultsにマップしないためです... – CodaFi

+3

なぜこのコンセプトはNSUserDefaultsに関係していますか –

1

NSCodingプロトコルを使用して、任意のオブジェクトをNSDataに変換できます。

あなたはサンプルコードはここにこれを行うに見つけることができます:

- (void)encodeWithCoder:(NSCoder *)aCoder 
{ 
    [aCoder encodeObject:self.name forKey:@"name"]; 
    [aCoder encodeInt:self.age forKey:@"age"]; 
    [aCoder encodeObject:self.email forKey:@"email"]; 
    [aCoder encodeObject:self.password forKey:@"password"]; 
} 
BOOL success = [NSKeyedArchiver archiveRootObject:person toFile:archiveFilePath]; 

と::

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    if (self = [super init]) { 
     self.name = [aDecoder decodeObjectForKey:@"name"]; 
     self.age = [aDecoder decodeIntForKey:@"age"]; 
     self.email = [aDecoder decodeObjectForKey:@"email"]; 
     self.password = [aDecoder decodeObjectForKey:@"password"]; 
    } 
    return self; 
} 
Person *unarchivePerson = [NSKeyedUnarchiver unarchiveObjectWithFile:archiveFilePath]; 
21

次のような独自のオブジェクトのために実装する必要があります。 NSDataに変換されたカスタムオブジェクトの例(ユーザーデフォルトに保存できるように)

次のファイルを作成します。

カタログ。時間

@interface Catalog : NSObject 

@property (nonatomic, assign) int pk; 
@property (nonatomic, copy) NSString *catalogName; 
@property (nonatomic, copy) NSString *catalogDescription; 
@property (nonatomic, assign) int catalogEdition; 
@property (nonatomic, assign) int catalogTotalPages; 

- (void)encodeWithCoder:(NSCoder *)aCoder; 
- (id)initWithCoder:(NSCoder *)aDecoder; 

@end 

Catalog.m

#import <Foundation/Foundation.h> 
#import "Catalog.h" 

@implementation Catalog 

- (void)encodeWithCoder:(NSCoder *)aCoder { 
    [aCoder encodeObject:self.catalogName forKey:@"catalogName"]; 
    [aCoder encodeObject:self.catalogDescription forKey:@"catalogDescription"]; 
    [aCoder encodeInt:self.catalogEdition forKey:@"catalogEdition"]; 
    [aCoder encodeInt:self.catalogTotalPages forKey:@"catalogTotalPages"]; 
} 

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    if (self = [super init]) { 
     self.catalogName = [aDecoder decodeObjectForKey:@"catalogName"]; 
     self.catalogDescription = [aDecoder decodeObjectForKey:@"catalogDescription"]; 
     self.catalogEdition = [aDecoder decodeIntForKey:@"catalogEdition"]; 
     self.catalogTotalPages = [aDecoder decodeIntForKey:@"catalogTotalPages"]; 
    } 
    return self; 
} 

@end 

最後に、あなたのコントローラ内のファイル

#import "Catalog.h" 

ヘッダと(ユーザデフォルトに保存この場合、イムに)あなたのオブジェクトを使用するには、このコードを追加含ま

  Catalog *catalog = [[Catalog alloc] init]; 
      catalog.catalogName = @"catalogName"; 
      catalog.catalogDescription = @"catalogName"; 
      catalog.catalogEdition = 1; 

注:実際のデータの受け渡しは、あなたがこの情報がお役に立てば幸い
NSData *nsData = [[NSUserDefaults standardUserDefaults] objectForKey:@"keyName"]; 
//unarchiving object to nsdata 
Catalog *selectedCatalog = [NSKeyedUnarchiver unarchiveObjectWithData: nsData]; 

NSDataの

から戻ってあなたのオブジェクトを取得したい場合は場所

//archiving object to nsdata 
NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:catalog]; 

[[NSUserDefaults standardUserDefaults] setObject:encodedObject forKey:@"keyName"]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 

を取っているところのコード行であります!

関連する問題