0

免責事項:私はObjective-Cにかなり慣れていません

コマンドライン プロジェクトを使用しています ARC が有効になっていません

MyClass というクラスがあります

@interface MyClass : NSObject
@end

@implementation MyClass
@end

そして私のメインは次のようになります

int main(int argc, char *argv[])
{
    MyClass *first = [MyClass new];
    MyClass *second = first;
    return 0;
}

質問:

  1. *firstの保持カウントが 1 であることはわかっていますが、 *secondの保持カウントも 1 である理由がわかりません。そのオブジェクトに対して新規、保持、割り当て、またはコピーを行っていません。

  2. *firstの保持カウントは 1 であるため、リリースを呼び出す必要がありますか? コードでわかるように、オブジェクトを解放する必要がありますが、パフォーマンス アナライザーはメモリ リークを示しません。なんで?

  3. *first*secondのメモリ アドレスの値が同じであることに気付きました。次に、割り当て時に*first保持カウントを 2 に増やす必要があると思います。しかし、そうではありません。なぜですか?

  4. *firstを保持して*secondに割り当てると、両方の保持カウントが 2 になっていることに気付きました (以下を参照)。

    int main(int argc, char *argv[])
    {
        MyClass *first = [MyClass new];
        [first retain];
        MyClass *second = first;
        return 0;
    }
    

    基本的に*secondは*firstの COPY になります。その場合、いつリリースされますか?

  5. コードを次のように変更すると、両方のポインターの保持カウントはどうなりますか?

    int main(int argc, char *argv[])
    {
        MyClass *first = [MyClass new];
        MyClass *second = first;
        [first retain];
        return 0;
    }
    

    つまり、*秒の保持カウントも増加しますか?

前もって感謝します。

4

1 に答える 1

3
  1. 呼び出して正しいnewalloc、保持カウント 1 でオブジェクトが作成されます。

  2. に割り当てsecondても保持カウントは変更されfirstません。Second は、first と同じオブジェクトへのポインタです。保持カウントはオブジェクトの変数であるため、同じオブジェクトへのすべてのポインターは常に同じ保持カウントを示します。

  3. 保持カウントを増やすには、クラスを使用して割り当てるか、@property手動で呼び出す必要があります。-retainあなたが今していることは、ウィークポインターと呼ばれます。second を first に割り当てても、元のオブジェクトの保持カウントは変更されません。

  4. はい、もう一度両方のポインターが同じオブジェクトを指しています。オブジェクトへの変更は、両方のポインターに反映されます。

  5. 両方のポインターが同じオブジェクトを指しているため、[最初の保持] を呼び出すと、単一のオブジェクトが変更され、それを指しているすべてのポインターが保持カウントの増加を示します。

と は、個々のオブジェクトではなくポインターとして考える必要がありfirstます。secondこのプログラムにはオブジェクトが 1 つしかなく、それが で作成されたもの-newです。最初のポインターまたは 2 番目のポインターのいずれかで release または keep を呼び出すと、両方が指す単一のオブジェクトにのみ変更を加えることができます。

于 2013-01-30T15:15:17.523 に答える