-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

如果我理解正确,请将对象存储在 an 中NSArray并释放它们。然后在你完成对象后释放数组。这是解决它的一种方法。

于 2012-08-24T00:12:49.850 回答
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];
    ⋮
}

编辑:感谢@H2CO3 发现交换的 alloc 和 init 调用。

于 2012-08-24T00:14:42.800 回答
0

看,当你将一个对象添加到 array时,它的引用计数会增加1,因为 array 是指该对象。因此,最好在将分配的对象添加到数组后释放它,或者在分配时将其标记为自动释放,以便在帧结束时选择所有标记为自动释放的对象进行垃圾回收。

所以试试这个,

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

或者这个,

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