NSDataについて

Konton's iPhone application labolatory

English top page

NSDataとは

NSDataの主な用途はファイルのバイナリデータの格納です。


代表的なメソッド(目的別)

ファイルのデータからNSDataオブジェクトを作りたい - initWithContentsOfFile:

ファイルにNSDataの内容を書き出したい - writeToFile:atomically:

データをログへ書き出したい - description

データの長さを知りたい - length:

データの一部を使って新しいNSDataオブジェクトを作りたい - subdataWithRange:


ファイルのデータからNSDataオブジェクトを作りたい - initWithContentsOfFile:

- (id)initWithContentsOfFile:(NSString *)path

ファイルの中にあるデータからNSDataオブジェクトを作ります。下の例では自分のアプリケーションのドキュメントフォルダにある、 data.xmlというファイルの内容をmyDataという名前のNSDataオブジェクトに入れています。一応ファイルが存在しないときに実行しないようにエラー対策をしています。

NSData *myData;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"data.xml"];
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL success = [fileManager fileExistsAtPath:dataPath];
if(success) {
    myData = [[NSData alloc] initWithContentsOfFile:path];
}

ファイルにNSDataの内容を書き出したい - writeToFile:atomically:

- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)flag

現在の中に格納されているデータをファイルに書き出します。attomicallyをYESにすると、 一度内容をファイルを別名で書き出し、その後で改名してその名前のファイルがある場合はそれを上書きします。 NOの場合は直接その名前で書き出します。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"data.xml"];
[myData writeToFile:path atomically:YES];

データをログへ書き出したい - description

- (NSString *)description

現在のデータをNSStringオブジェクトにします。データがちゃんと格納されているかログへ出力して確認する際によく使われます。 大きいデータだとログ出力もかなり時間がかかるので、可能ならログ出力での確認は小さいデータで行ったほうが良いでしょう。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"data.xml"];
NSData *myData = [[NSData alloc] initWithContentsOfFile:path];
NSLog(@"myData:%@",[myData description]);

データの長さを知りたい - length:

- (NSUInteger)length

現在オブジェクト内に格納されているデータの長さをNSUIntegerで返します。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"data.xml"];
NSData *myData = [[NSData alloc] initWithContentsOfFile:path];
NSLog(@"myData:%d",[myData length]);

データの一部を使って新しいNSDataオブジェクトを作りたい - subdataWithRange:

- (NSData *)subdataWithRange:(NSRange)range

データの一部を使って新しいNSDataオブジェクトを作ります。NSRangeは中にlocation(位置)とlength(長さ)の2つの変数を持ちます。 下のコード例のwriteDataはこのコードが書かれているオブジェクトのメンバでNSDataオブジェクトであり、writeLocationは同じくメンバでNSUInteger型の変数です。; もともとのデータ(writeDataに入っています)から一部分ずつ切り出した小分けのデータ(dataForWriteToFile)を作り、それを書き込むのに作ったコードの一部を引っ張ってきたものです。 全体を一気に書き込むのにはwriteToFile:を使えば良いのですが、この場合はNSFileHandleを使って少しずつ書き込んでいます。

NSRange range;
if(writeLocation + 32768 < writeData.length) {
    range.length = 32768;
} else {
    range.length = writeData.length - writeLocation;
}
range.location = writeLocation;
NSData *dataForWriteToFile = [writeData subdataWithRange:range];
前へ次へ
Copyright© 2009 Konton All rights reserved. - このサイトについて - サイトマップ

Valid XHTML 1.1 正当なCSSです!