2009-10-13 1 views
1

Я рассмотрел следующий вопрос.Как/где выпустить глобальные переменные в объективе c? -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 
//------------------------------------------------ 

Ok. Путаница заключается в том, как «dealloc 120 размер» LayerData * boxLayerData [10] [12]; «array?»

Plz. Дайте некоторое предложение.

Заранее благодарен.

Сагар.

ответ

7

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

Что-то вроде этого:

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

, но выделяются лишь некоторые из них. как выделено [5] [2], и выделяется [3] [1]. если я установил для него цикл, это не правильный путь. –

+0

Хорошо. Я думал, что это единственный способ. Итак, наконец я последовал этому пути. –

+0

будьте осторожны, чтобы проверить, есть ли объект на [n] [m]. – pxl

1

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

+0

Yup! это массив указателей. Он создается, когда пользователь начинает новый уровень. Пользователь может прервать уровень и перезапустить уровень. Таким образом, может быть выделена огромная память. Но я очень растерялся в том, чтобы отложить его. –

2

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

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

+0

Yup! Ты прав. Я знаю об этом. Когда я начал разработку, у меня было только одно значение для глобального. Развивая игру, мои требования к глобальному росту постепенно возрастали. Наконец, у меня есть массив из 120 как глобальный. Я знаю, что это не очень хорошая практика. Но прямо сейчас для меня важно завершить игру. Поэтому я задал вопрос, есть ли альтернативное решение. –

+0

Полностью понять. – pxl