4

から新しい変数にNSString値をコピーしようとしています。配列内のオブジェクトと同じメモリアドレスを持つ を返しています。なんで?NSMutableArrayNSString stringWithStringNSString

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{

    @autoreleasepool {

        NSMutableArray *arr = [NSMutableArray arrayWithObject:@"first"];

        NSLog(@"string is '%@' %p", [arr objectAtIndex:0], [arr objectAtIndex:0]);

        // copy the string
        NSString *copy = [NSString stringWithString:[arr objectAtIndex:0]];
        NSLog(@"string is '%@' %p", copy, copy);

    }
    return 0;
}
4

2 に答える 2

7

1) 構文を使用して文字列を作成するときはいつでも@""、フレームワークは文字列を自動的にキャッシュします。NSStringは非常に特殊なクラスですが、フレームワークが処理します。アプリの複数の場所で使用する@"Some String"と、それらはすべてメモリ内の同じアドレスを指します。のようなものを使用している場合のみ-initWithData:encoding、文字列はキャッシュされません。

-copy2)他の回答は、代わりに使用する必要があることを示唆していますが-copy、オブジェクトが変更可能な場合にのみオブジェクトのコピーを作成します。(NSMutableString など)不変オブジェクト (NSString など) に
送信する場合、オブジェクト自体を返す-copy送信と同じになります。-retain

NSString *originalString = @"Some String";
NSString *copy = [originalString copy];
NSString *mutableCopy1 = [originalString mutableCopy];
NSString *mutableCopy2 = [mutableCopy copy];
NSString *anotherString = [[NSString alloc] initWithString:originalString];

--> originalStringcopymutableCopy2およびanotherStringはすべて同じメモリ アドレスを指し、mutableCopy1ポイントだけがメモリの異なる領域を実行します。

于 2012-08-09T19:57:13.580 に答える
4

NSStringインスタンスはミュータブルではないため、この+stringWithString:メソッドは参照カウントをインクリメントした入力文字列を返すだけです。

新しい同じ文字列を強制的に作成したい場合は、次を試してください

NSString * copy = [NSString stringWithFormat:@"%@", [arr objectAtIndex:0]];

ただし、他の理由でポインターを一意にする必要がない限り、そうすることにはほとんど意味がありません...

于 2012-08-09T19:49:21.460 に答える