-2

こんにちは、ヘッダー ファイルからポインターを格納しない既に aclloc クラスを解放する方法を混乱させています。ループの後、クラスへのポインタがすべて同じインスタンス名であるため、失われました。

for(i=0;i<20;i++){
  MyClass *class = [[MyClass init]alloc];
   class.count = i;
  [classArray addObject:class];  
  [self addToScene:class];

}

メモリの割り当てと保持の基本的な概念は理解していますが、cocos2d を使用してプログラムしているため、エラーの原因が Object-c にあるのか cocos2d にあるのかわかりません。object-c のディーリング メモリについて明確にしたいと思います。助けて:-)

4

4 に答える 4

1

Præ-scriptum: alloc と init 呼び出しを交換する必要があります (最初に割り当ててから初期化します)。

それらをループ内で解放する必要があります-それらを配列に追加すると、それらが保持されます。

for(i = 0;i < 20; i++) {
    MyClass *obj = [[MyClass alloc] init];
    obj.count = i;
    [classArray addObject:obj];
    [obj addToScene:obj];
    [obj release];
}
于 2012-08-24T00:14:32.420 に答える
0

オブジェクトを配列に追加すると、配列がそのオブジェクトを参照しているため、その参照カウントが1増加します。したがって、割り当てられたオブジェクトを配列に追加した後に解放するか、割り当て時に自動解放としてマークを付けると、フレームの終わりにガベージコレクションの対象として自動解放としてマークされたすべてのオブジェクトが選択されます。

だからこれを試してみてください

MyClass *obj = [[[MyClass alloc] init] autorelease];

またはこれ、

MyClass *obj = [[MyClass alloc] init];
....
....
[classArray addObject: obj];
[obj release];
于 2012-08-24T07:35:59.657 に答える
0

配列は独自の内容を保持するため、次のいずれかを保持しないようにする必要があります。

// Simpler
{
    MyClass *c = [[[MyClass alloc] init] autorelease];
    ⋮
}

また:

// Less memory
{
    MyClass *c = [[MyClass alloc] init];
    ⋮
    [c release];
}

あるいは:

// Rely on ARC (simpler and less memory).
{
    MyClass *c = [[MyClass alloc] init];
    ⋮
}

編集:交換された alloc と init 呼び出しを発見した @H2CO3 の功績。

于 2012-08-24T00:14:42.800 に答える
0

私があなたを正しく理解していれば、オブジェクトを に保管してNSArray解放してください。次に、オブジェクトの操作が完了したら、配列を解放します。これはそれについての1つの方法です。

于 2012-08-24T00:12:49.850 に答える