NSArray жизненный цикл - PullRequest
       2

NSArray жизненный цикл

2 голосов
/ 10 марта 2011

Я создаю объект NSArray в файле .h:

NSArray *tempArray;

и чем я размещаю его в файле .m в методе viewDidLoad ():

tempArray = [[NSArray alloc] init]; //initilaize
tempArray = [connect connectSeriesJSonBack]; //fill it (I try it works)

Но я хочу использовать этот массив в другом методе, например:

    - (void)scrollViewDidEndDecelerating:(UIScrollView *)_scrollView 

Как я могу организовать жизненный цикл массива, потому что я использую alloc, retain и т. Д., И ни в коем случае не возвращать данные массива снова.

Ответы [ 5 ]

3 голосов
/ 10 марта 2011

Не освобождайте массив в методе, а вместо этого освобождайте его в методе dealloc - так вы можете использовать его в других местах.

В противном случае здесь возникает другая проблема.

Здесь вы создаете оставленный, пустой, неизменный NSArray

tempArray = [[NSArray alloc] init];

И теперь вы перезаписываете указатель на этот сохраненный экземпляр, да, вы только что слили NSArray

tempArray = [connect connectSeriesJSonBack];

И этот метод должен возвращать автоматически выпущенный NSArray. Который будет автоматически освобожден и исчезнет, ​​как только вы попадете в цикл событий.

Вы должны сделать что-то вроде этого

-(void)whereverThisIs {
    // Do not retain here if connectSeriesJSonBack returns a retained instance
    tempArray = [[connect connectSeriesJSonBack] retain];
 }

 -(void)dealloc {
     [tempArray release];
 }

 -(void)anotherMethod {
     if ( tempArray ) { // Do things }
 }
2 голосов
/ 10 марта 2011

Ваше второе назначение для tempArray приведет к утечке памяти, потому что выделение больше никогда не будет доступно. connectSeriesJSonBAck, вероятно, вернет автоматически выпущенный NSArray. Если вы хотите продолжать ссылаться на него вне текущей области, то вам следует сохранить его:

вместо:

tempArray = [[NSArray alloc] init]; //initilaize
tempArray = [connect connectSeriesJSonBack]; //fill it (I try it works)

до

tempArray = [connect connectSeriesJSonBack];
[tempArray retain];

и добавьте [tempArray release] в методе класса dealloc.

0 голосов
/ 10 марта 2011

Если вы вернете автоматически освобожденный массив из функции [connect connectSeriesJSonBack];, тогда ваш tempArray будет иметь счетчик возврата 0 после viewDidLoad метода.

Существует два подхода, как заставить его работать

1) использовать объект NSMutableArray и добавить объекты

tempArray = [[NSMutableArray alloc] init];
[tempArray addObjectsFromArray:[connect connectSeriesJSonBack]];

2) сохранить возвращенный массив

tempArray = [[connect connectSeriesJSonBack] retain];
0 голосов
/ 10 марта 2011

Я предлагаю объявить это в реализации как

@implementation YourViewController

NSMutableArray *mutableExample;
// or 
NSArray *example;

, затем в -()viewdidload выделить его как mutableExample = [[[NSMutableArray alloc] init]retain]; или просто example = [[NSArray alloc] init];

, и вы можете использовать его везде, где.не забудь выпустить его !!!

надеюсь, это поможет, если что-то неясно, спроси это в комментарии

wblade

0 голосов
/ 10 марта 2011

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

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