1

我使用 Nib 作为几个按钮的模板。它似乎工作正常,他们每个人都有自己独立的状态。但是,当我去释放按钮时,我会在 dealloc 中崩溃。这是代码...

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 or Not。这是dealloc

- (void)dealloc {

    delete[] mSoundTag;

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

崩溃是在 UIButton -> UIButtonContent dealloc 中对 super dealloc 的调用。我假设我的内存管理做得很差,比如释放两次,但我不知道在哪里。

我通过多次加载笔尖来做的事情合法吗?

4

2 回答 2

3

从 NIB 加载按钮后,您必须保留该按钮。如果不这样做,则不允许您稍后释放它,并且一旦您的代码将控制权返回给运行循环(当自动释放池耗尽时),您将无法访问该按钮。

NSMutableArrayPS:使用 Cocoa 集合 ( ) 来存储对按钮的引用不是更容易吗?你的代码对我来说太复杂了。

于 2011-05-11T18:34:57.993 回答
1

NSArray如果您使用属性并使用 an来存储按钮实例,它将大大简化您的内存管理。

[[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 和属性将使整个过程更容易和更易于维护。

于 2011-05-11T19:27:08.253 回答