Cocoa API解説(macOS/iOS)

iOS , Mac アプリケーション開発のために使われる主要フレームワークの日本語情報です。

目次

NSDataクラス

INDEX>Foundation>NSData

変更しない生データクラス

Mac Pro MD878J/A 3.5GHz

Mac Pro MD878J/A 3.5GHz

解説

変更しない生データです

継承 NSObject
準拠 NSCoding
  NSCopying
  NSMutableCopying
  NSObject (NSObject)
フレームワーク /System/Library/Frameworks/Foundation.framework
使用可能 Mac OS X v10.0 以降
iOS 2.0 以降
定義 NSData.h



NSData Class ReferenceMac


NSData Class ReferenceiOS


概要

バイナリデータのクラスです。このクラスは変更不可です。変更可能なデータを扱うには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では使用中止

データのテスト

– isEqualToData:
– length