0

このサンプル コードをテストしました。

サンプル.h

 {

    NSString *string1;
    NSString *string2;
    NSMutableString *string3;
}

@property (assign) IBOutlet NSWindow *window;
@property (strong,nonatomic) NSString *string1;
@property (copy,nonatomic) NSString *string2;
@property (strong,nonatomic) NSMutableString *string3;

@end

サンプル.m

#import "Sample.h"

@synthesize string1;
@synthesize string2;
@synthesize string3;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    string1 = [[NSString alloc] init];
    string2 = [[NSString alloc] init];
    string3 = [[NSMutableString alloc] initWithString:@"test"];
    string2 = string3;
    string1 = string3;
    [string3 appendString:@"test"];
    NSLog(@"%@",string1);
    NSLog(@"%@",string2);
    NSLog(@"%@",string3);

}

@end

結果は

2012-09-23 00:11:48.610 sample[13468:303] testtest
2012-09-23 00:11:48.611 sample[13468:303] testtest
2012-09-23 00:11:48.611 sample[13468:303] testtest

プロパティがコピーなのでstring2は「test」にすべきだと思います。ただし、string2 は「testtest」です。

string2 = [string3 copy];

と思う結果です。

string2 is "test"

なんで?教えてください、よく眠れません。

4

2 に答える 2

5

問題は、プロパティにアクセスしていないのに、バッキング インスタンス変数をすぐに操作していることです。これらの ivars の場合、=演算子は特別なものではなく、セッター メソッドを呼び出す効果はありません。これは単なる通常のポインター割り当てです。だからあなたが書くとき

string2 = string3;
string1 = string3

string3次に、ポインタを両方string1に割り当てますstring2- 何をするにしstring3ても、他の 2 つの変数にも有効です。実際には、それらはまったく同じ文字列インスタンスを指しているためです。

あなたがしなければならないことは、1つ、あなたのプロパティをcopy代わりに宣言することstrong、2つ、書くことです

self.string2 = string3;
self.string1 = string3

セッターメソッドを呼び出して、実際に文字列の独立したコピーを作成するため。

P.s。あなたを使用して NSString の2つの空のインスタンスを作成することによって

string1 = [[NSString alloc] init];
string2 = [[NSString alloc] init];

コードを作成してから、それらの変数に別のものを再割り当てすると、メモリ リークが発生します。

編集:あなたは幸運ですが、そうではありません-ARCを使用して。古いランタイムでは、ユーザーの RAM の貴重なバイトを浪費していました。

それでも。これらのインスタンスを作成する必要はありませんmemcpy()。文字を事前に割り当てられたメモリに直接格納するわけではありません。iOS 開発に深く入り込む前に、C ポインターに関する包括的なチュートリアルをお読みください。

于 2012-09-22T16:05:17.347 に答える
0

string2プロパティのセッターセマンティクスが であるとあなたが言う理由がわかりませんcopy。あなたはそれを宣言しましたstrong

NSStringポインター string2 をポインター string3 に設定しますNSMutableString。次に、string3 が指す可変文字列の変更に進みました。したがって、string2 がそれを反映していることを期待する必要があります。

ところで、これが可変オブジェクトを持つオブジェクトに対してセッター セマンティクスを 使用する必要がある主な理由です。copy

于 2012-09-22T16:05:28.437 に答える