【问题标题】:How/where to release global variables in Objective C?如何/在哪里释放 Objective C 中的全局变量?
【发布时间】:2009-10-13 17:17:11
【问题描述】:

我已经解决了以下问题。

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];”数组?”

【问题讨论】:

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


    【解决方案1】:

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

    类似这样的:

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

    【讨论】:

    • 但只分配了几个。就像分配了 a[5][2] 和分配了 a[3][1]。如果我为它设置循环,这不是正确的方法。
    • 好的。我以为这是唯一的方法。所以,最后我是这样走的。
    • 小心检查 a[n][m] 处是否有物体。
    • 我已经实现了类似的东西。 if(boxLayerdata[i][j]!=nil){ [boxLayerData[i][j] release];boxLayerData[i][j]=nil;}
    • 不需要检查 nil。在 Objective-C 中,向 nil 发送消息什么都不做,因此不需要检查。
    【解决方案2】:

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

    通过这种方式,您可以设计对这些数据的访问,这样您就不会在其设置之前写入新数据或尝试访问刚刚释放的东西,定义是否以原子方式访问数组元素,确保线程安全,丰富。

    【讨论】:

    • 是的!你说的对。我知道这一点。当我开始开发时,我对全局只有一个值。在开发游戏的过程中,慢慢地我对全球的需求增加了。最后,我有 120 个全局数组。我知道这不是一个好习惯。但现在,对我来说,完成游戏很重要。所以我在这里问了问题是否有其他可用的解决方案。
    【解决方案3】:

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

    【讨论】:

    • 是的!它是指针数组。它在用户开始新级别时创建为 &。用户可以中止关卡并重新启动关卡。因此,可能分配了巨大的内存。但我对取消分配感到非常困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    相关资源
    最近更新 更多