1

メインファイルに次がある場合

int main ( int argc, const char * argv[])
    {
        @autoreleasepool
        {
            Complex * c1 = [[Complex alloc] init];
            Complex * c2 = [[Complex alloc] init];

            Complex * compResult;

            compResult = [c1 add: c2]; 
            [compResult print];
        {

         return0;        

    {

/**implementation of add method **/
-(Complex *) add: (Complex *) f
{
    Complex *result = [[Complex alloc] init]
    result.real = real + f.real;
    result.imaginary = imaginary + f.imaginary;
    return result;
} 

c1 と c2 がオブジェクトであることはわかっていますが、compResult = [c1 add: c2]; を実行するまでは、compResult は変数と見なされます。

ここでの私の仮定は、add メソッドが Object を返し、compResult = [c1 add: c2]; を実行することです。compResult をそのオブジェクトと等しく設定しています。それでは、compResult をオブジェクトに変換しますか?

したがって、私の考えでは、compResult は [c1 add: c2] の結果を受け取る変数ですが、[compResult print] を実行すると、メッセージを送信するときにのみこの構文を使用できると思っていたので、本当に混乱します (この中でケースプリント)オブジェクトに?

私の主な質問は、compResult = [c1 add: c2]; を実行した後であると思います。オブジェクトを保持/表す変数 compResult ですか、それとも実際にオブジェクトになりますか????

4

2 に答える 2

3

c1およびc2はオブジェクトではなく、オブジェクトへのポインターです。同様に、compResultもポインタですが、宣言時には初期化されていないため、特定のオブジェクトを指していません。

add:経由でメソッドを呼び出す[c1 add:c2]と、新しいオブジェクトが作成され、それへのポインタが返されます。そのポインターは に割り当てられcompResultます。 はや とcompResultまったく同じポインタですが、この新しく作成されたオブジェクトを指すようになりました。c1c2[compResult print][c1 add:c2]

編集者注:add:現在使用している保持されたオブジェクトよりも、自動解放されたオブジェクトを返す方が慣用的です。

于 2013-07-19T17:53:34.180 に答える
1

どちらc1もオブジェクトではありません -宣言のアスタリスクで示されているように、どちらもc2オブジェクト*への参照です。と の違いcompResultは、どちらも宣言時に初期化されるのに対し、 は初期化されていないことcompResultです。

割り当ての後、メソッドcompResult内で割り当てられたオブジェクトへの参照が保持されます。addARC では、変数は__strongデフォルトで考慮されます。つまり、結果オブジェクトはcompResultスコープ外になると解放されます。


*技術的にはc1c2はポインターですが、ARC 対応のコードでは、それらが指すオブジェクトを保持および解放する特別な権限を取得するため、私はそれらを「オブジェクト参照」と呼びました。

于 2013-07-19T17:57:01.730 に答える