F450

ブログ > エントリ > 理論上はmutableなはずのNSString?

2010/02/26(金) 17:07:16 (JST)

理論上はmutableなはずのNSString?

Mac OS XではCocoaというフレームワークが採用されている。
その中で、文字列を扱うクラスにNSStringというクラスが存在する。
NSStringはimmutable(変更不可)な文字列を扱うクラスであり、mutable(変更可)な文字列を扱いたい場合はNSMutableStringを使う。
NSMutableStringはNSStringの直接の子クラスである。
しかしNSMutableStringだけがNSStringの子クラスではない。
それはNSStringとその子孫クラスでクラスクラスタを形成しているからである。
まぁ、そんなことは敢えて言わなくても、AppleのNSStringに関するreferenceに明記されている訳ですが。
NSString *string = [[NSString alloc] initWithString:@"a string."];では、stringはNSCFStringのインスタンスとなる。
で、NSCFStringは、実のところNSMutableStringの子クラス。
[string isKindOfClass:[NSMutableString class]]の返り値はもちろん真。
そんなわけで、[string respondsToSelector:@selector(replaceCharactersInRange:withString:)]の返り値も真。
stringはもともとNSStringのインスタンスのつもりで作成したはずなのに、実はmutable??
しかし、objc_msgSend(string, @selector(replaceCharactersInRange:withString:), NSMakeRange(1, 1), @" mutable ");なんてしてみると、'Attempt to mutate immutable object with replaceCharactersInRange:withString:'なんていう'NSInvalidArgumentException'が投げられる。
どうやら(当然?)NSCFStringでは-replaceCharactersInRange:withString:を受け付けないようになっているらしい。
なら、最初からNSCFStringをNSMutableStringの子クラスにせずにNSStringの子クラスにすればいいのに…なんていうのは素人考えなんでしょうなぁ。
【背景】
Perlで自前の文字列クラスを作るに当たってどうしようか考えていて、NSStringをパクればにインスパイアされればいいんだと思ってあれこれしていたときに浮かんだ疑問が上記。
どうでもいいっちゃ、どうでもいいんですが。
【参考文献】Dynamic Objective-C

このエントリへのコメント

このエントリにコメントはありません。

コメント新規投稿

サインインすると投稿できる文字数が増えます。
名前:
URL:
コメント:
注意事項
  • コメントの内容は、公序良俗に反しないようにして下さい。
  • 投稿されたコメントは、サイト管理人によって恣意的に修正や削除が行われることがあります。
  • サインインしてコメントを投稿すれば、後から投稿者自身で編集することもできます。ただし、回数制限等があります。
  • コメントではMarkdownを使用することができます(HTMLタグについては一部のみ可)。
  • コメントできる文字数は、サインインしているかどうかなどユーザの状態によって違います。
  • コメントを投稿すると、それに付随する情報(コメントを投稿した時間, サインイン中のアカウントに関する情報, アクセス元IPアドレス, etc.)がサーバに保存され、一部または全部が公開されることがあります(ただし、一般にはこれらの情報だけで実在の個人を特定することはできないはずです)。
  • コメントが投稿されたことをTwitter@YOCKOW_jpで報せます(※サーバエラーなどで報知できないことがあります)。
  • 一定時間内に連続してコメントを投稿することはできません。
  • 色んな意味でYOCKOWの独壇場です。