Hatena::Groupiphone-dev

iPhoneアプリ開発まっしぐら★ このページをアンテナに追加 RSSフィード

引っ越し後の日記はコチラです

tokoromのその他の日記

2010-01-06

1.1 NSString -文字列- 目次

| 01:59 | はてなブックマーク -  1.1 NSString -文字列- 目次 - iPhoneアプリ開発まっしぐら★

UIKit本追加/補足 > データ管理クラス解説編 > 1.1 NSString -文字列-


    • 1.1.1 NSStringと文字列定数
    • 1.1.2 初期化 (準備中)
    • 1.1.3 文字列長の取得 (準備中)
    • 1.1.4 書式 (準備中)
    • 1.1.5 UNICHAR形式での文字列の抽出 (準備中)
    • 1.1.6 バイト配列の抽出 (準備中)
    • 1.1.7 C言語形式の文字列の抽出 (準備中)
    • 1.1.8 結合 (準備中)
    • 1.1.9 パディング (準備中)
    • 1.1.10 部分文字列の取得 (準備中)
    • 1.1.11 分割 (準備中)
    • 1.1.12 トリミング (準備中)
    • 1.1.13 シンプルな検索 (準備中)
    • 1.1.14 複雑な検索 (準備中)
    • 1.1.15 置換 (準備中)
    • 1.1.16 シンプルな比較 (準備中)
    • 1.1.17 複雑な比較 (準備中)
    • 1.1.18 大文字と小文字の変換 (準備中)
    • 1.1.19 数値への変換 (準備中)
    • 1.1.20 文字エンコーディング (準備中)
    • 1.1.21 ファイルへの保存と読み込み (準備中)
    • 1.1.22 パスの管理 (準備中)
    • 1.1.23 URLの管理 (準備中)

1.1.1 NSStringと文字列定数

| 02:31 | はてなブックマーク -  1.1.1 NSStringと文字列定数 - iPhoneアプリ開発まっしぐら★

UIKit本追加/補足 > データ管理クラス解説編 > 1.1 NSString -文字列- > 1.1.1 NSStringと文字列定数



Objective-Cでは、文字列定数を

@"文字列定数"

と @"" で囲って記述するが、この文字列定数もNSStringの一種だ。そのため、文字列定数に対してもNSStringの各種インスタンスメソッドをコールできる。例えば、以下2つのコードは同じ結果となる。

NSString* string = [NSString stringWithString:@"TEST"];
NSLog( "%d", [string length] );     //< 4
NSLog( "%d", [@"TEST" length] );  //< 4

もっと言えば、@"TEST"で初期化したNSStringオブジェクトと、文字列定数の@"TEST"は同一のオブジェクトなのだ(アドレスも同じ)。

NSString* string = [NSString stringWithString:@"TEST"];
NSLog( "%p", string );     //< これが 0x12345678 だとすると・・・

NSLog( "%p", @"TEST" );  //< これも 0x12345678 になるのだ!

これにより、NSStringが自動でメモリ領域を共用し、使用するメモリ容量を節約してくれているのがわかる。

それでは、NSStringを文字列定数以外で初期化した場合もメモリは共用されるだろうか。以下のコードで実証してみよう。

NSLog( @"%p", @"TEST" ); //< 例: 0x3030
NSLog( @"%p", [NSString stringWithString:@"TEST"] ); //< 例: 0x3030
NSLog( @"%p", [[[NSString alloc] initWithString:@"TEST"] autorelease] ); //< 例: 0x3030
NSLog( @"%p", [NSString stringWithUTF8String:"TEST"] ); //< 例: 0x3d1ff10
NSLog( @"%p", [NSString stringWithUTF8String:"TEST"] ); //< 例: 0x3d21440

実行結果は以下のとおりだ。

0x3030

0x3030

0x3030

0x3d1ff10

0x3d21440

このように文字列定数以外で初期化した場合には、結果として保持する文字列が一緒であっても別のメモリ領域が使われてしまう。

また、文字列定数でなければ全く同じ初期化を繰り返しても新しいメモリ領域が使われてしまうこともわかった。