Сохранить счет = 0 в другой функции?проблема управления памятью? - PullRequest
0 голосов
/ 14 июня 2010

Я объявил NSMutableArray в заголовочном файле с:

NSMutableArray *myMuArr;

и

@property (nonatomic, retain) NSMutableArray *myMuArr;

В файле .m у меня есть делегат из другого класса:

-(void)didGrabData:(NSArray*)theArray {
self.myMuArr = [[[NSMutableArray alloc] initWithArray:myMuArr]retain];
}

Если я хочу получить доступ к self.myMuArr в cellForRowAtIndexPath, он пуст (я проверил счетчик сохранения массива и он равен 0)

Что я делаю не так?

Конечно, он выпущен в сделке, нигде.

Буду очень благодарен за любую помощь: 0)

Ответы [ 2 ]

1 голос
/ 14 июня 2010

Я не думаю, что вы понимаете, когда оставить и отпустить. Взгляните на этот ТАК вопрос и ответьте . Прочтите его, поймите и прочитайте статьи, на которые он ссылается. Это вам очень поможет. Это важно понять на iPhone.

Ваш массив сохраняется 3 раза, но вам нужен только один: (1) Когда вы вызываете alloc / init, вы получаете собственный массив (он сохраняется). (2) Когда вы звоните, удерживайте, это дополнительное удержание. (3) Ваш сеттер self.myMuArr был определен для сохранения в @property, поэтому при назначении указателя с помощью метода сеттера он снова сохраняется.

Вы обычно видите, что код использует эти два метода, оба являются правильными:

-(void)didGrabData:(NSArray*)theArray {
   NSMutableArray *arr = [[NSMutableArray alloc] initWithObjects:obj1, obj2, nil];
   self.myMutArr = arr;
   [arr release];       
}

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

-(void)didGrabData:(NSArray*)theArray {
   self.myMutArr = [NSMutableArray arrayWithObjects:obj1, obj2, nil];
}
1 голос
/ 14 июня 2010

В конечном итоге вы должны сохранить счет 3, если бы не тот факт, что вы пытаетесь инициализировать массив с его содержимым до его существования.Попробуйте заменить эту строку кода:

self.myMuArr = [[[NSMutableArray alloc] initWithArray:myMuArr]retain];

на эту строку:

self.myMuArr = [NSMutableArray arrayWithArray:theArray];
...