iPhoneアプリの開発を勉強しています。よくサンプルで、


NSMutableData* data1 = [[NSMutableData data] retain];

というのを見かけるのですが、[NSMutableData data] の中にあるdataは何ですか?
[ClassName MehodName] という記法は、メソッドを呼ぶためのもののようですが、リファレンスマニュアルを調べてみたところ、data という名前のクラスメソッドは、NSMutableDataには定義されていないようです。
このdataが、どのように機能しているのか教えてください。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/09/11 23:12:58
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:n85 No.1

回答回数237ベストアンサー獲得回数21

ポイント35pt

このdataはメソッドではなくインスタンスですね。

まず、NSMutableDataのインスタンスを作成しておき、

appendData:というメソッドでデータを追加することになると思います。

id:norisuke3

この角括弧 [ ] で囲われた記法はメソッド呼び出しのものだと思っていたのですが、二つ目のリテラルとしてインスタンス名を記述するのは初めて見ました。角括弧内でクラス名/オブジェクト名に続いてインスタンス変数を記述するとどうなるのか今イチ良く理解できないのですが、これについてどういう文法なのか解説しているサイトなどご存知でしたら教えていただけると非常に嬉しいです。

2009/09/10 22:17:35
id:drill256 No.2

回答回数175ベストアンサー獲得回数7

ポイント35pt

[NSMutableData dataWithLength:0]と同じです。

中身が空っぽのNSMutableDataオブジェクトです。

id:norisuke3

宣言すらされていないdataというリテラルを中身が空のNSMutableDataオブジェクトとして使えるという事ですか?それとも、dataというのは、そういう目的で使用するための予約語だったりするのかな?

2009/09/10 22:06:48
  • id:n85
    なかなかぴったりくるページを見つけられなかったのでコメントに書きます。
    いくつか似たようなコードがあったので参考になればと思います。

    ---
    http://d.hatena.ne.jp/KishikawaKatsumi/20081014/1223986859
     
    NSMutableData *theData = [NSMutableData data];
    ...
    [theData writeToFile:dataFilePath atomically:YES];

    ---
    http://d.hatena.ne.jp/KishikawaKatsumi/20081014/1223986859
     
    NSMutableData *data = [NSMutableData data];
    [data appendData:[@"device=" dataUsingEncoding:NSUTF8StringEncoding]];

    ---
    http://sora.pekori.to/ref/tenten/cocoa.htm
     
    NSMutableData *data=[NSMutableData data];
    ...
    return [data writeToFile:path atomically:YES];
  • id:norisuke3
    いろいろ調べていてわかったのですが、正解は、[NSMutableData data] の data は、NSData クラスのクラスメソッドという事のようです。

    リファレンスを見てみると、NSString, NSArray, NSData などのクラスにはそれぞれ string, array, data というクラスメソッドが定義されており、空の文字列/配列/データオブジェクトを返すようになっています。

    NSMutableDataの 場合、NSData の子クラスなので、mutableData クラスメソッドは無くて、親クラスのdataクラスメソッドで、空のデータオブジェクトを取得できるようになっているようです。

    ちなみにn85さんの教えてくれたサイトの3つ目 "Mac OS X TIPS - Cocoa" の「オブジェクトの自動解放で注意する事」の節(おまけ)によると、

    > +alloc & -init & -autorelase = +[classname]
    >
    > ex.)
    > [[NSString alloc] init] autorelase] = [NSString string]

    という事です。
    いろいろありがとうございました。
  • id:norisuke3
    このようなクラスメソッドは、クラスファクトリメソッドと呼ばれるようです。

    参考:
    http://www.zone0.ne.jp/pgwiki/index.php?Cocoa%2FCocoa%28Objective-C%29%E3%81%AE%E3%83%A1%E3%83%A2%E3%83%AA%E7%AE%A1%E7%90%86

    > *5 これはObjective-Cの言語仕様ではなく、慣例。自分のクラスを作成するときもこれに倣うと良い。
  • id:drill256
    説明が雑ですみませんでした。

    クラスファクトリメソッドについて一言注意を。
    クラスファクトリメソッドはautoreleaseになっています。
    (内部で、[[[NSData alloc] init] autorelease]されたものが返ってくる)

    したがって、保持しておく必要がある場合にはretainする必要があります。
    保持しないならば、放っておけば大丈夫です。
  • id:norisuke3
    いえいえ。コメントありがとうございました。
    そうですね。autorelease されたものが返って来るようですね。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません