NSDataクラス
INDEX>Foundation>NSData
変更しない生データクラス
- 出版社/メーカー: Apple Computer
- メディア: Personal Computers
- この商品を含むブログを見る
解説
変更しない生データです
継承 | NSObject |
準拠 | NSCoding |
NSCopying | |
NSMutableCopying | |
NSObject (NSObject) | |
フレームワーク | /System/Library/Frameworks/Foundation.framework |
使用可能 | Mac OS X v10.0 以降 |
iOS 2.0 以降 | |
定義 | NSData.h |
概要
バイナリデータのクラスです。このクラスは変更不可です。変更可能なデータを扱うにはNSMutableDataクラスを使います。
C言語のフレームワークであるCore FoundationのCFDataRefと、トールフリーブリッジです。ARC環境以外ではそのまま使用できます。
どちらかのフレームワークにしかないメソッド・関数を使いたい場合、キャストして使うことが出来ます。
ARC環境では、管理対象のオブジェクトキャストに__bridge、__bridge_retained、__bridge_transferが必要になります。
Dataオブジェクトの作成
URLで指定したリソースからデータオブジェクト(NSData)を作成するには(+ dataWithContentsOfURL)メソッドを使用します。読み込み時にキャッシュするかどうかのオプションを指定でき、エラーがあったかどうかの結果が返ってくる(+ dataWithContentsOfURL:options:error)メソッドもあります。
ファイルパスで指定したリソースからデータオブジェクトを作成するには(+ dataWithContentsOfFile:)メソッドを使用します。読み込み時にキャッシュするかどうかのオプションを指定でき、エラーがあったかどうかの結果が返ってくる(+ dataWithContentsOfFile:options:error)メソッドもあります。
リソースの指定はURLが推奨されています。こちらのメソッドより前述のURL指定のメソッドを使うようにして下さい。
URLのリソースからデータオブジェクトを作成するサンプル
(test.pngという名前のPNGファイルがプロジェクトに入っています。)
#pragma mark NSData dataWithContentsOfURL:options:error -(void)method003 { NSBundle *bundle = [NSBundle mainBundle]; NSURL *aUrl = [bundle resourceURL]; NSString *filename = @"test.png"; NSURL *newURL = [aUrl URLByAppendingPathComponent:filename]; NSError *anError = nil; NSData *aData = [NSData dataWithContentsOfURL:newURL options:NSDataReadingUncached error:&anError]; NSLog(@"%u bytes",[aData length]); }
Swiftでは
//NSData getBytes:length: @IBAction func function001(sender: AnyObject) { var char : [Byte] char = [0x10 , 0x1A, 0xBF , 0x00 , 0xAA , 0xFF] var dat1 = NSData(bytes: char, length: 6) println("\(dat1)") //-><101abf00 aaff> }
サブクラスであるNSMutableDataの作成用に(+ data)メソッドも定義されています。
バイト列からデータを作成するには(+ dataWithBytes:length)メソッド、(+ dataWithBytesNoCopy:length)メソッド、(+ dataWithBytesNoCopy:length:freeWhenDone)メソッドを使います。NoCopyの付いているメソッドはバイト列のコピーをしません。freeWhenDone:にYESを渡すとデータオブジェクト(NSData)が解放されたときに、元のバイト列も解放されます。
NoCopyの付いていないメソッド(+ dataWithBytes:length)はコピーされたバイト列をレシーバが所有しているのでレシーバが解放されたときにバイト列も解放されます。データオブジェクト(NSData)からデータオブジェクトを作成するには(+ dataWithData)メソッドを使用します。
バイト列がコピーされるかどうかの検証
#pragma mark NSData dataWithBytesNoCopy: -(void)method007 { unsigned char *pngBytes = malloc(sizeof(unsigned char)*5); pngBytes[0] = 0x0001; pngBytes[1] = 0x0002; pngBytes[2] = 0x0003; pngBytes[3] = 0x0004; pngBytes[4] = 0x0005; //コピーされないほう NSData *data1 = [NSData dataWithBytesNoCopy:pngBytes length:5 freeWhenDone:YES]; //コピーされる方 NSData *data2 = [NSData dataWithBytes:pngBytes length:5]; unsigned char testByte1[5]; unsigned char testByte2[5]; [data1 getBytes:testByte1]; //OS X10.10で非推奨 [data2 getBytes:testByte2]; NSLog(@"%s %u",__FUNCTION__,pngBytes[0]); NSLog(@"%s %u",__FUNCTION__,testByte1[0]); NSLog(@"%s %u",__FUNCTION__,testByte2[0]); //元のデータを変更してみる pngBytes[0] = 0x0009; [data1 getBytes:testByte1]; [data2 getBytes:testByte2]; NSLog(@"%s %u",__FUNCTION__,pngBytes[0]); //=>9 変更された! 当たり前 NSLog(@"%s %u",__FUNCTION__,testByte1[0]);//=>9 変更された 元のデータを参照しているから NSLog(@"%s %u",__FUNCTION__,testByte2[0]);//=>1 変更されない(コピーしているから) }
allocで作成した後、上記と同じような初期化メソッドがあります。
URLのリソースの内容から初期化するメソッド(– initWithContentsOfURL)(– initWithContentsOfURL:options:error)、ファイルパスのリソースの内容から初期化するメソッド(– initWithContentsOfFile)(– initWithContentsOfFile:options:error)、バイト列から初期化するメソッド(– initWithBytes:length)(– initWithBytesNoCopy:length)(– initWithBytesNoCopy:length:freeWhenDone)、データから初期化するメソッド(– initWithData)です。
データへのアクセス
レシーバの内容へのポインタを取得するには(– bytes)メソッドを使用します。データの内容を文字列にするには(– description)メソッドを使用します。
データの先頭から長さを指定してバイト列を取り出すには(– getBytes:length)メソッドを、範囲を指定して取り出すには(– getBytes:range)メソッドを使用します。
指定した範囲のバイト列を新しいデータオブジェクトにするには(– subdataWithRange)メソッドを使用します。
レシーバから指定の範囲で指定のデータを検索するには(– rangeOfData:options:range)メソッドを使用します。
レシーバの長さを取得するには(– length)メソッドを使用します。レシーバと別のデータオブジェクトが同じかどうかを調べるには(– isEqualToData)メソッドを使用します。
データのストア
データオブジェクトをURLのリソースに書き出すのは(– writeToURL:atomically)メソッドを使用します。オプション付きの(– writeToURL:options:error:)もあります。
データオブジェクトをファイルに書き出すのは(– writeToFile:atomically:)メソッドを使用します。オプション付きの(– writeToFile:options:error)もあります。URLを使った方法が推奨されています。
#pragma mark NSData dataWithContentsOfURL -(void)method010 { //バンドル内のリソースのtest.pngを読み込み NSBundle *bundle = [NSBundle mainBundle]; NSURL *aUrl = [bundle resourceURL]; NSString *filename = @"test.png"; NSURL *newURL = [aUrl URLByAppendingPathComponent:filename]; NSData *aData = [NSData dataWithContentsOfURL:newURL]; //ユーザーのドキュメントフォルダにnew.pngとしてに書き込み NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; NSString *writefilename = @"new.png"; NSURL *bUrl = [NSURL fileURLWithPathComponents:[NSArray arrayWithObjects:documentsDirectory, writefilename, nil]]; [aData writeToURL:bUrl atomically:YES]; //検証 NSData *pngData = [NSData dataWithContentsOfURL:bUrl]; NSLog(@"%u bytes",[pngData length]); //=>[OOOAppDelegate method010] 10796 bytes }
データオブジェクトの作成 | |||
+ data | 10.0 | 2.0 | |
+ dataWithBytes:length: | |||
+ dataWithBytesNoCopy:length: | |||
+ dataWithBytesNoCopy:length:freeWhenDone: | |||
+ dataWithContentsOfFile: | |||
+ dataWithContentsOfFile:options:error: |
+ dataWithContentsOfMappedFile: iOSなし (OS X10.10で非推奨)
+ dataWithContentsOfURL:
+ dataWithContentsOfURL:options:error:
+ dataWithData:
– initWithBytes:length:
– initWithBytesNoCopy:length:
– initWithBytesNoCopy:length:freeWhenDone:
– initWithContentsOfFile:
– initWithContentsOfFile:options:error:
– initWithContentsOfMappedFile: iOSなし (OS X10.10で非推奨)
– initWithContentsOfURL
– initWithContentsOfURL:options:error:
– initWithData:
データへのアクセス
– bytes
– description
– getBytes:length:
10.0- レシーバに入っているデータのうち先頭からlengthバイト分をaBufferにコピーします [Swift2.0]
– getBytes:range
– subdataWithRange:
– rangeOfData:options:range:
– getBytes: 10.6では使用中止