Сбой высвобождения после нескольких нагрузок на кончики - PullRequest
1 голос
/ 11 мая 2011

Я использую перо в качестве шаблона для нескольких кнопок.Казалось, работает нормально, у каждого из них есть свое независимое государство.Однако, когда я пошел отпустить кнопки, я потерпел крах в разлочке.Вот код ...

mSoundBtns = new cSoundButton*[mNumSounds];
for(unsigned int i = 0 ; i < mNumSounds; ++i) {
    mSoundBtns[i] = nil;
}

for(unsigned int s = 0; s < mNumSounds; ++s) {

    [[NSBundle mainBundle] loadNibNamed:@"InstanceSoundButton" owner:self options:nil];
    //Auto Loads via Outlet into 'soundNib'

    mSoundBtns[s] = soundNib;
    soundNib = nil;

    uint32 count = mSoundBtns[s].retainCount;
    NSLog(@"Last Count: %d", count);
}


for(unsigned int j = 0; j < mNumSounds; ++j) {
    [mSoundBtns[j] release];  //**** Crash here on 7th (of 8) release
    mSoundBtns[j] = nil;
}

Заголовок:

@interface cLocationContext {
   ...

   cSoundButton** mSoundBtns;
   IBOutlet cSoundButton* soundNib;

}

@property (nonatomic, assign) IBOutlet cSoundButton* soundNib;

@end

Перо очень простое, оно просто включает родительское представление и дочернее представление пользовательского типа представления.Nib

cSoundButton просто отслеживает имя и логическое состояние Mute или Нет.Здесь есть dealloc

- (void)dealloc {

    delete[] mSoundTag;

    // Call the inherited implementation
    [super dealloc];  //****Crashes in here
}

Сбой происходит внутри вызова super dealloc, в UIButton -> UIButtonContent dealloc.Я предполагаю, что я делаю что-то плохое с моим управлением памятью, например, двойную обработку, но я не могу определить, где.

Допустимо ли то, что я делаю, загружая перо несколько раз?

Ответы [ 2 ]

3 голосов
/ 11 мая 2011

Вы должны сохранить кнопку, как только загрузите ее из NIB.Если вы этого не сделаете, вам не разрешат выпустить ее позже, и вы не сможете получить доступ к кнопке, как только ваш код вернет управление в runloop (когда пул авто-выпуска очищается).

PS: Не проще ли использовать коллекцию Какао (NSMutableArray) для хранения ссылок на кнопки?Ваш код выглядит слишком сложным для меня.

1 голос
/ 11 мая 2011

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

[[NSBundle mainBundle] loadNibNamed:@"InstanceSoundButton" owner:self options:nil];
//Auto Loads via Outlet into 'soundNib'

[mSoundBtns addObject:self.soundNib];
self.soundNib = nil;

Позже, когда придет время выпустить

[mSoundBtns release];

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

self.soundNib = something;
[self setSoundNib:something];

Когда вы устанавливаете soundNib = nil, вы устанавливаете переменную soundNib в ничто, теряя ссылку на загруженную вами кнопку.Если бы вы не добавили указатель на массив и не выпустили его позже, вы бы все пропустили.Технически, то, как ты это делаешь, может работать ... но не делай так.Использование правильных NSArray s и свойств значительно облегчит и поддержит весь этот процесс.

...