Как / где выпустить глобальные переменные в Objective C? - PullRequest
1 голос
/ 13 октября 2009

Я прошел через следующий вопрос.

Цель C - Где вы имеете дело с глобальными статическими переменными?

Но вопрос связан со статическими переменными. У него что-то иное, чем у меня.

У меня есть следующий код в приложении.

//.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
//------------------------------------------------

OK. Моя путаница заключается в том, «как бороться с размером 120» LayerData * boxLayerData [10] [12]; «массив?»

Ответы [ 3 ]

8 голосов
/ 13 октября 2009

Тот же ответ применяется к глобальному, как и к статическому. Если вам нужны данные за весь жизненный цикл приложения, просто оставьте их как есть, и память будет возвращена ОС после завершения работы приложения. Если вам нужно освободить объект во время выполнения приложения, вы можете перебрать массив и вызвать освобождение для каждого объекта.

Примерно так:

for (int i = 0; i < 10; i++)
{
  for (int j = 0; j < 12; j++)
  {
     LayerData *data = boxLayerData[i][j];
     [data release], data = nil;
  }
}
2 голосов
/ 14 октября 2009

вы обеспокоены тем, что пользователь прерывает и перезапускает уровень. Рассматривали ли вы создание одноэлементного класса, который будет хранить все эти сохраненные / совместно используемые данные вместо глобальных?

таким образом, вы можете спроектировать доступ к этим данным таким образом, чтобы вы не писали новые данные перед их набором или пытались получить доступ к чему-то, что только что было недавно освобождено, определяли, к элементам массива обращаются атомарно, гарантируют безопасность потока, в изобилии.

1 голос
/ 13 октября 2009

boxLayerData в приведенном выше коде выглядит как массив указателей. В то время как указатели могут нуждаться в управлении некоторыми средствами, массив, в котором хранятся эти указатели, необязательно должен быть надлежащим образом удален при завершении работы приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...