2

質問があります:

私はC++インスタンスを明示的に「new」および「」しませんが、objective-cクラスが初期化されると自動的に「 」および「」を呼び出します。何か案が?deletenewdelete

class myCppTestClass
{
public:
    myCppTestClass()
    {
        NSLog(@"MyCpp constructor");
    }

    ~myCppTestClass()
    {
        NSLog(@"MyCpp destructor");
    }
};



@interface MyTestClass : NSObject
{
    myCppTestClass myCppInstance;
}

@end


@implementation MyTestClass


@end

そして私はそれをこのように呼びます:

NSLog(@"Create an object.");
MyTestClass *objcObject = [[MyTestClass alloc] init];
NSLog(@"Object created");
[objcObject release];
objcObject = nil;
NSLog(@"Object released.");

次に、それを実行します。ログは次のようになります。

2012-11-16 12:01:18.747 iOSVersion[87248:f803] Create an object. 
2012-11-16 12:01:18.749 iOSVersion[87248:f803] MyCpp constructor
2012-11-16 12:01:18.750 iOSVersion[87248:f803] Object created
2012-11-16 12:01:18.751 iOSVersion[87248:f803] MyCpp destructor
2012-11-16 12:01:18.752 iOSVersion[87248:f803] Object released. 

自動参照カウンティングについてではありません。閉じているので、何かアイデアはありますか?どうもありがとう。

繰り返しますが、MyTestClassがこのような場合、コンストラクタとデストラクタは呼び出されません。

@interface MyTestClass : NSObject
{
    myCppTestClass * myCppInstance;
}

およびログ:

2012-11-16 12:22:38.710 iOSVersion[87428:f803] Create an object.
2012-11-16 12:22:38.711 iOSVersion[87428:f803] Object created
2012-11-16 12:22:38.712 iOSVersion[87428:f803] Object released.
4

2 に答える 2

4

この言語はそうではなくnewdeleteあなたのために、コンストラクタとデストラクタを呼び出します。これはC++の標準的な動作です。オブジェクトを直接または間接的に作成すると、含まれているオブジェクトのコンストラクターが呼び出されます。同様に、含まれているオブジェクトの割り当てが解除されると、含まれているすべてのインスタンスのデストラクタも呼び出されます。

于 2012-11-16T04:11:15.810 に答える
1

newC ++では、deleteオブジェクトの作成には使用されません。RAMの新しく割り当てられた*領域にオブジェクトを作成するために使用されます。myCppInstanceのデータはヒープに割り当てられていません。実際にはの一部ですMyTestClass。コードでMyTestClassオブジェクトを作成すると、作成済みのが含まれmyCppTestClassます。

同様に、myCppTestClass変数を作成すると、そのクラスのデータは基本的にスタックに無料で割り当てられます。宣言されたスコープの最後で割り当てが解除されます(例外がある場合でも)。

newとを使用deleteすると、オブジェクトへのポインタを取得し、その存続期間を管理する責任があります。C ++を学び始めたばかりの場合は、それらを完全に避けたいと思うかもしれません。最新のC++では、のmake_shared代わりに使用するのが最適でnewあり、「決して」使用しないでdeleteください。

*新しい配置を使用している場合を除きます

于 2012-11-16T04:14:02.487 に答える