2010/02/26(金) 17:07:16 (JST)
理論上はmutableなはずのNSString?
Mac OS XではCocoaというフレームワークが採用されている。
その中で、文字列を扱うクラスにNSStringというクラスが存在する。
NSStringはimmutable(変更不可)な文字列を扱うクラスであり、mutable(変更可)な文字列を扱いたい場合はNSMutableStringを使う。
NSMutableStringはNSStringの直接の子クラスである。
しかしNSMutableStringだけがNSStringの子クラスではない。
それはNSStringとその子孫クラスでクラスクラスタを形成しているからである。
その中で、文字列を扱うクラスにNSStringというクラスが存在する。
NSStringはimmutable(変更不可)な文字列を扱うクラスであり、mutable(変更可)な文字列を扱いたい場合はNSMutableStringを使う。
NSMutableStringはNSStringの直接の子クラスである。
しかしNSMutableStringだけがNSStringの子クラスではない。
それはNSStringとその子孫クラスでクラスクラスタを形成しているからである。
まぁ、そんなことは敢えて言わなくても、AppleのNSStringに関するreferenceに明記されている訳ですが。
で、NSCFStringは、実のところNSMutableStringの子クラス。
そんなわけで、
stringはもともとNSStringのインスタンスのつもりで作成したはずなのに、実はmutable??
しかし、
どうやら(当然?)NSCFStringでは-replaceCharactersInRange:withString:を受け付けないようになっているらしい。
なら、最初からNSCFStringをNSMutableStringの子クラスにせずにNSStringの子クラスにすればいいのに…なんていうのは素人考えなんでしょうなぁ。
【背景】
Perlで自前の文字列クラスを作るに当たってどうしようか考えていて、NSStringをパクればにインスパイアされればいいんだと思ってあれこれしていたときに浮かんだ疑問が上記。
どうでもいいっちゃ、どうでもいいんですが。
【参考文献】Dynamic Objective-C
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
このエントリへのコメント
このエントリにコメントはありません。