- ベストアンサー
Objective-CでNSStringを複製する方法
- Objective-CでNSStringを複製する方法について説明します。
- TextFieldに入力した文字列を別のクラスのメンバに複製する方法を考えています。
- メソッドを使用して文字列を保持するクラスのメンバに代入する方法を試しましたが、うまくいきませんでした。他の有効な方法を教えていただけると幸いです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>ここで Get した文字列にアクセスすると例外で落ちます。 returnしたオブジェクトは呼び出した側でretainしないとすぐ解放されちゃうよ。それで落ちちゃうんじゃない?
その他の回答 (2)
- harawo
- ベストアンサー率58% (3742/6450)
NSStringのインスタンスは、「文字列定数」という特別な扱いになります。 NSStringのインスタンスを、NSObjectのメソッド「retainCount」を使って、NSLogでRetain数を調べてください。intの最大値が出力され、Retain数がカウントされないことがわかります。retain、releaseしても、Retain数が変化しないこともわかります。 つまり、NSStringのインスタンスをコピーしようとしても、ポインタ値がそのまま受け渡されるだけでも、不都合はありません。releaseしても開放されることはなく、親プロセスが終了し、開放されるまで、ともに保持し続けられます。 > -(void) SetText( NSString* para) Objective-Cのメソッドは、小文字で始め、C言語の関数は大文字で始めるという規則となっております。別にそれに従う必要はありませんが、コードを読み返すときに、そうしたほうが読みやすいという理由で、推奨されています。
補足
ご回答ありがとうございます。 私のプログラムでは、para の retainCount は 3 となりました。 必ずしもプロセス終了まで保持しているわけではないようです。 おそらく、ソースコード上のリテラル文字列が特別な扱いとなるのではないでしょうか。 尚、私のプログラムでは「SetText」の呼び出し元はこんな感じとなっています。 (要点以外は省略しています) @interface MyView : UIAlertView { UITextField* textField; } @end @implementation MyView - (id )initWithFrame:(CGRect)Frame { self = [super initWithFrame:Frame]; // テキストフィールド生成 textField = [[UITextField alloc] initWithFrame: CGRectMake( 10.0f, 80.0f, 200.0f, 30.0f)]; [textField setBorderStyle:UITextBorderStyleRoundedRect]; // AlertViewのSubvierとして追加 [self addSubview: textField]; return self; } -(id) dealloc { para = textField.text; [(保持したいクラス) SetText: para]; [textField release]; [super dealloc]; } @end UIAlertView に UITextField を追加し、ユーザへ文字列を入力を促します。 UITextField へユーザ入力した文字列を MyView が消えた後でも、保持していたいのです。 textField を release しまうと、(保持したいクラス)のmember へのアクセスが不可能になってしまいます。 AccessViolationで例外が発生しました。 尚、[textField release] をするのをやめたてみたところ、member へのアクセスは可能でした。 ただし、これでは textField がメモリリークとなってしまいますが。 >Objective-Cのメソッドは、小文字で始め、C言語の関数は大文字で始めるという規則となっております。 それは知りませんでした。 ありがとうございます。
- SAYKA
- ベストアンサー率34% (944/2776)
initWithString って元になるNSStringが有るって前提だからそのままアドレス渡しになっちゃうだけでしょ。 allocで確かに NSString* を確保しているから memberそのもののアドレスはparaとは別だろうね。 initWithFormatにするとか
お礼
ご回答ありがとうございました。 しかし、member に代入されるアドレスは、para と同じ値になります。 initWithFormat も試してみましたが、うまくいきませんでした。 あ、うまくいかない、と言うのは、 -(NSString*) GetText { return member; } で member を見せているのですが、 ここで Get した文字列にアクセスすると 例外で落ちます。 もう少し解決策を探ってみます。 ありがとうございました。
お礼
allocしても、retainしても同じ動作をするようですね。 allocと言ってるのに同じアドレスになるのがイマイチ理解できていなかったようです。 ご回答いただいた内容が直接原因となっていたわけではありませんが、調査の重要な手がかりになりました。ありがとうございました。