0

Objective-CでNSMutableArray入力に基づいて文字列を返すメソッドを記述しています。私は呼び出し元が文字列を変更するつもりはないが、それほど気にすることはできない。プロジェクトは現在、ロープを学ぶためには、コマンドライン財団ツールであるが、これは最終的にはiPhoneアプリになってしまいますメソッドからNSStringを返すときのメモリ管理と所有者

- (NSMutableString *) generateString:(NSMutableArray *)myArray 

:としてメソッドの現在の署名が読み込みます。

私の質問は以下のとおりです。

  1. NSStringのを返すために、より賢明だろうか?

2)NSMutableStringを返すときは、自動解放を使用する必要がありますか?あなたがNSStringを返すことを推奨しているなら、それはどのようにそれを返すように変更するのですか?

3)エラーが発生したかどうかを識別するエラーオブジェクトを返したい場合は、おそらくenumと文字列その場合所有権はどのように動作しますか?このメソッドはalloc、new、またはcopyと呼ばれていないので、呼び出し元はどのように知っていますか?どのように私は上記のメソッドの文字列に加えて、割り当てられたエラーオブジェクトを返しますか?

ありがとうございます!

+0

あなたに関係があるかどうかは分かりませんが、NSArrayからNSStringを得ることができます:NSString * myString = [myArray componentsJoinedByString:@ ""]; ' – filipe

+0

ありがとうフィリペ、私はそれを知らなかった。それは滑らかなアイデアですが、最終的な文字列がどのように生成されるかに影響を及ぼす必要なロジックがあるので、この場合は私にとってはうまくいかないでしょう。 – BigBrother

答えて

5
  1. ほとんどの場合、私はNSStringを返します。メモリの使用量がやや少なくなり、呼び出し元に変更可能なコピーが必要な場合は、コピーを作成する方法としては、mutableCopyです。
  2. あなただけでなく、になる必要があります。NSStringまたはNSMutableStringあなたのメソッドは戻ります(少なくとも例のようにメソッドの名前を付けた場合)! Memory Management Programming Guideには、完全な混乱を避けるために従わなければならない規則が列挙されており、すべてを詳細に説明しています。だからそれを読んで!
  3. Foundationフレームワークは、エラーを記述するためにNSErrorクラスを使用します。追加のパラメータは、あなたの方法は次のようになり、「RETURN」に:

    - (NSString *)generateString:(NSMutableArray *)myArray error:(NSError **)error 
    { 
        BOOL failed; 
        // Do some fancy stuff, if the operation fails, failed is true 
        if (failed == YES) { 
         if (error != NULL) { 
          *error = [NSError errorWithDomain:@"your_domain" code:123 userInfo:nil]; 
         } 
         return nil; 
        } 
    
        return [yourString autorelease]; 
    } 
    
    // ... 
    
    // Calling your method 
    NSError *error = nil; 
    [someObject generateString:someArray error:&error]; 
    

注2 **と任意のNSError varがあり得ることをNULLなくnil(あなたがメソッドのボディで、このためにチェックする必要があります) 。

+0

これは '* error = [NSError'ではなく、'&error = [NSError'ではありません。また、 'error == NULL'でもnilを返す必要があります。通常、この種のケースを処理するために2つのネストされた' if'を使用します。Thinkosは私たちの最善を打ちのめす - 私はそれがここで起こったことを推測している! –

+0

ヒントのおかげで - *エラーは間違いなく、もちろん - 、 - コードの両方の問題を修正しました。 – mplappert

1

デフォルトでは、メソッドはautorelease NSStringを返しますが、私は同じ振る舞いを使うよう勧めます。結果の文字列を変更する必要がある場合は、一時的な文字列を使用できます。

+0

私はあなたが「デフォルトでメソッドはオートリースNSStringを返す」ということを知りません。このデフォルトの動作はどこで確認できますか? – Chuck

+0

Nickolayありがとうございますが、私はあなたがこれによって何を意味するのか完全にはっきりしていません。これは私が求めていることにどのように適用されますか? – BigBrother

+0

mplappertはより良い方法でこのアイデアを説明しました) –

関連する問題