如何/在何处释放Objective C中的全局变量?

时间:2009-10-13 17:17:11

标签: objective-c xcode global-variables cocos2d-iphone

我已经完成了以下问题。

Objective C - Where do you dealloc global static variables?

但问题与静态变量有关。它有一些与我不同的情况。

我在应用程序中有以下代码。

//.h file
#import "cocos2d.h"
#import "something.h"
#import "myLayer.h"
#import "LayerData.h"

// i have taken this variables as global 
// because two different classes are simultaneously accessing it

myLayer *myCurrentLayer;
LayerData *boxLayerData[10][12];

@interface one
    // my class definition here
@end

@interface two
    // my second class definition here
@end


//------------------------------------------------
@implementation one
    // my class constructor here.
    -(id)init{
        myCurrentLayer=[[myLayer alloc] init];
        // boxLayerData is initialized with objects
    }
@end

@implementation two
    // second class constructor
    -(id)init{
        [myCurrentLayer setPosition:ccp(10,20)];
        [self schedule something for movements];
    }
@end
//------------------------------------------------

行。我的困惑是“如何释放120大小的”LayerData * boxLayerData [10] [12];“数组?”

3 个答案:

答案 0 :(得分:8)

同样的答案适用于全局,因为它适用于静态。如果您需要整个应用程序生命周期的数据,请保持原样,并在应用程序终止时由操作系统回收内存。如果需要在应用程序执行期间释放对象,可以遍历数组并在每个对象上调用release。

这样的事情:

for (int i = 0; i < 10; i++)
{
  for (int j = 0; j < 12; j++)
  {
     LayerData *data = boxLayerData[i][j];
     [data release], data = nil;
  }
}

答案 1 :(得分:2)

您担心用户中止并重新启动关卡。您是否考虑过创建一个单例类来存储所有这些存储/共享数据而不是全局?

通过这种方式,您可以设计对此数据的访问,这样您就不会在设置之前写入新数据或尝试访问刚刚解除分配的内容,定义是否以原子方式访问数组元素,确保线程安全。

答案 2 :(得分:1)

上面代码中的

boxLayerData似乎是一个指针数组。虽然指针可能需要通过某种方式进行管理,但存储这些指针的数组不需要,并且在应用程序终止时将被正确处理。