macOS/iOS API解説

iOS , Mac アプリケーション開発のために使われる主要フレームワークの日本語情報です。2010年代に書かれた内容です。今後更新はありません。

目次

NSMutableData

INDEX>Foundation>

変更可能な生データクラス

解説

変更可能な生データです

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

概要

変更可能なバイナリデータのクラスです。

C言語フレームワークである、Core FoundationのCFDataRefとトールフリーブリッジです。ARC環境以外ではそのまま使用できます。
どちらかのフレームワークにしかないメソッド・関数を使いたい場合、キャストして使うことが出来ます。

ARC環境では、管理対象のオブジェクトキャストに__bridge、__bridge_retained、__bridge_transferが必要になります。

変更可能なデータオブジェクトの作成

仮の容量を指定して変更可能なデータオブジェクトを作成するには(+ dataWithCapacity: メソッドを使用します。仮の容量は作成時の効率化のために使用されるだけで必要になれば自動的にメモリを確保します。

長さを指定して変更可能なデータオブジェクトを作成するには(+ dataWithLength: メソッドを使用します。内容は0に書き換えられます。

それぞれallocで作成した後初期化するメソッドがあります。(– initWithCapacity: )(– initWithLength:)

長さを指定して変更可能なデータオブジェクトを作成

#pragma mark NSData dataWithCapacity:
-(void)method002
{
    NSMutableData *aData = [NSMutableData dataWithCapacity:100];
    NSLog(@"%s %@",__FUNCTION__,[aData description]);
}

長さを調整

レシーバの末尾に0で埋めたデータを付加するには(– increaseLengthBy: メソッドを使用します。

レシーバの先頭からの長さをセットするには(– setLength: メソッドを使用します。現在のレシーバの長さよりも短い場合はセットする長さより後の部分は切り捨てられます。現在のレシーバの長さよりも長い場合は末尾に0で埋められたデータが追加されます。

末尾に0で埋められたデータを追加

#pragma mark NSData increaseLengthBy:
-(void)method004
{
    NSMutableData *aData = [NSMutableData dataWithLength:20];
    NSLog(@"%s %@",__FUNCTION__,[aData description]);
    //=><00000000 00000000 00000000 00000000 00000000>
    [aData increaseLengthBy:10];
    NSLog(@"%s %@",__FUNCTION__,[aData description]);
    //=><00000000 00000000 00000000 00000000 00000000 00000000 00000000 0000>

}

データへのアクセス

レシーバのポインタを取得するには(– mutableBytesメソッドを使用します。

データの追加

レシーバの末尾にデータオブジェクトを追加するには(– appendData: メソッドを使用します。レシーバの末尾にバイト列を追加するには(– appendBytes:length: メソッドを使用します。

レシーバに別のデータを追加

#pragma mark NSData appendData
-(void)method007
{
    unsigned char *pngBytes = malloc(sizeof(unsigned char)*5);
    pngBytes[0] = 0x01;
    pngBytes[1] = 0x02;
    pngBytes[2] = 0x03;
    pngBytes[3] = 0x04;
    pngBytes[4] = 0x05;
        
    NSMutableData *aData = [NSMutableData dataWithLength:20];
    NSLog(@"%s %@",__FUNCTION__,[aData description]);
    //=><00000000 00000000 00000000 00000000 00000000>
    [aData appendBytes:pngBytes length:5];
    NSLog(@"%s %@",__FUNCTION__,[aData description]);
    //=><00000000 00000000 00000000 00000000 00000000 01020304 05>
}

データの修正

指定した範囲をバイト列で置換するには(– replaceBytesInRange:withBytesメソッドを使います。
指定した範囲を指定した長さのバイト列で置換するには(– replaceBytesInRange:withBytes:lengthメソッドを使います。置き換えるバイト列がそれまでものより短ければ、レシーバ全体が短くなります。
指定した範囲を0で埋めるには(– resetBytesInRangeメソッドを使用します。

レシーバすべてを別のデータオブジェクトの内容で置き換えるには(– setData: メソッドを使用します。

指定の範囲を0で埋めたデータに置き換え

#pragma mark NSData resetBytesInRange
-(void)method011
{
    int elementCount = 20;
    unsigned char *pngBytes = malloc(sizeof(unsigned char)*elementCount);
    for (int i = 0; i < elementCount; i++) {
        pngBytes[i] = 0xFF;
    }
    NSData *data1 = [NSData dataWithBytesNoCopy:pngBytes length:5 freeWhenDone:YES];
  
    
    NSMutableData *aData = [NSMutableData data];
    NSLog(@"%s %@",__FUNCTION__,[aData description]);
    //=><>
    [aData setData:data1];
    NSLog(@"%s %@",__FUNCTION__,[aData description]);
    //=><ffffffff ffffffff ffffffff ffffffff ffffffff>
    
    [aData resetBytesInRange:NSMakeRange(5, 8)];
    NSLog(@"%s %@",__FUNCTION__,[aData description]);
    //=><ffffffff ff000000 00000000 00ffffff ffffffff>
    
    void *dataPointer = [aData mutableBytes];
    NSLog(@"%s %p",__FUNCTION__,dataPointer);
}
データへアクセスする

– mutableBytes

クラスメソッド