Copyright (C) iPhoneアプリ開発備忘録 All rights reserved.
ブログ内で記したコード、内容の正確性は保証いたしません。
記載内容を実装したことにより発生した不具合・損害等の責任は一切負いません。



2011年01月31日

NSStringとNSMutableString



文字列インスタンスで、変更しないもの(変更できないもの)はNSString、変更可能なものはNSMutablStringと使い分けるのが基本だが、実際はNSStringの文字列は変更できてしまう。
しかしながら、変更できているように見えて、実は別のアドレス(メモリ領域)に書き込み、新たなアドレスに書き込まれた変更された文字列を取り扱う仕組みとなっている。
このNSStringインスタンスに、次々と文字列の変更書き込みを行っていると、以前に書き込んだメモリ領域が残ったままで、メモリリークの要因となってしまう。

従って、NSStringインスタンスは絶対変更しない文字列のみ格納するようにし、変更する文字列はNSMutableStringに格納することを厳守すべきである。NSStringインスタンスに設定する値が同一値であっても、そのNSstringインスタンスに文字列を設定する箇所は1箇所のみにすべきである。

また、文字列を初期化する場合、stringWithFormatまたは、stringWithStringで初期化をしてしまうと、簡易コンストラクタという扱いとなり、このインスタンスを破棄(release)するのは、NSStringクラスオブジェクトそのものの責任となり、自分が作ったクラスから破棄することができない。(逆に言うと放っておいても自動的に破棄される)

これを回避し、自分で破棄できるようにするためには、initWithFormatまたは、initWithStringを使用する。このinit〜メッセージを送ることにより、自分で破棄できるようになる。iPhoneのようなメモリに制限のあるデバイスの場合、メモリ解放は自分で明示的に行ったほうがよい場合が多いので、init〜で初期化することを推奨する。

NSString *hoge = [[NSString alloc] initWithString:@"fuga"];


また、文字列の結合については、NSStringとNSMutableStringではメソッドが異なるので注意。

NSStringの場合、
hoge = [fuga stringByAppendingString hage];

NSMutableStringの場合、
[hoge appendString hage];

NSMutableStringインスタンスに、stringByAppendingStringで文字列結合を行うと、ビルド時に警告メッセージが表示されて、とりあえず動作する(文字列結合も行われる)が、意図しないメモリリークが起こる可能性もあるので、正しくappendStringメソッドで文字列結合を行うこと。


NSMutableStringインスタンスに文字列を格納する場合、
hoge = @"fuga";
と記述してしまうと、実体はNSStringとして取り扱われるので、
hoge = [NSMutableString alloc] initWithString:fuga];
とNSMutableStringで初期化して文字列を格納することを明示すること。


参考書籍:
iOSデバッグ&最適化技法 for iPad/iPhone
國居貴浩
秀和システム
売り上げランキング: 4711

 




タグ:iPhone
posted by mobileDeveloper at 12:53 | Comment(0) | TrackBack(0) | NSMutableString はてなブックマーク - NSStringとNSMutableString | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
Apple、Appleのロゴ、App Store、iPodのロゴ、iTunesは、米国および他国のApple Inc.の登録商標です。
iPhone、iPod touch、iPadはApple Inc.の商標です。
iPhone商標は、アイホン株式会社のライセンスに基づき使用されています。
その他、本ブログに記載されている製品名、会社名は、それぞれ各社の商標または登録商標です。