0

私は、Objective-cでのポインタとメモリ管理に頭を悩ませるために、少しコードをいじっています。しかし、私が理解できないように見えるのは、このコードを使用しているということです。

hello *myHello = [[hello alloc] init];

NSString *string = @"Hello";

myHello.property = string;

NSStringインスタンス(@ "Hello")は、パラメーターとしてsetterメソッドに渡されますか、それともポインターが送信されますか。たとえば、「string」を変更して別のオブジェクトを指すようにした後、変数を取得した場合、それは「Hello」のままですか、それとも「string」が指す新しいオブジェクトに変更しますか?前もって感謝します!

4

2 に答える 2

1

ジムは良い答えを出しましたが、人々に役立つかもしれないので、視覚的なものを追加したいと思います。

* string =@"test"と言います

文字列は、@"test"を格納するメモリ位置を指しています

基本的に、次のようになります。

      @"test"
        ^
string /

あなたがするとき:

myHello.property = string;

このように、文字列があったのと同じ場所にプロパティを設定しているだけです。

     @"test"
        ^
string /  \ property

次に、文字列を後で@ "hello"と言うように変更すると、メモリ内に別の場所を作成し、他の場所を保持します。今はこんな感じです。

      @"hello"  @"test"
        ^         ^
string /           \ property 

プロパティが改ざんされる可能性がある唯一の方法は、ポインタをいじった場合です。それはおそらく決して起こらないので、あなたはそれについて心配する必要はありません。

一部の初心者は、これがメモリの問題を引き起こすと考えていますが、そうではありません。ARCは、プロパティが終了したことを通知し、メモリ自体を削除します。

お役に立てば幸いです。

于 2013-01-09T21:17:27.880 に答える
0

あなたがするとき:

myHello.property = string;

プロパティがコピーなしで定義されている場合、文字列が指すのと同じ場所を指すように設定されます。

プロパティがcopyで定義されている場合、元の文字列の新しいコピーを指すように設定されます。

いずれの場合も、文字列を変更して別の文字列(@ "Goodbye"など)を指すようにすると、プロパティは引き続き@"Hello"を指します。

于 2013-01-09T20:59:51.440 に答える