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 または Not を追跡します。これがデロックです

- (void)dealloc {

    delete[] mSoundTag;

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

クラッシュは、UIButton -> UIButtonContent dealloc の super dealloc への呼び出し内にあります。メモリ管理で2回の割り当て解除など、何か悪いことをしていると思いますが、どこを見つけることができません。

ペン先を複数回装填することは合法ですか?

4

2 に答える 2

3

NIBからボタンをロードしたら、すぐにボタンを保持する必要があります。そうしないと、後でリリースすることはできません。また、コードが制御をrunloopに戻すと(自動リリースプールが空になると)、ボタンにアクセスできなくなります。

NSMutableArrayPS:ボタンへの参照を保存するためにCocoaコレクション()を使用する方が簡単ではないでしょうか?あなたのコードは私には複雑すぎるように見えます。

于 2011-05-11T18:34:57.993 に答える
1

プロパティを使用し、を使用し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ください。次の 2 行はまったく同じです。

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

設定soundNib = nilすると、変数soundNibを何も設定せず、ロードしたボタンへの参照が失われます。ポインターを配列に追加して後で解放しなかった場合は、すべてがリークされます。技術的には、あなたのやり方でうまくいくかもしれませんが、そのようにしないでください。適切なNSArrayとプロパティを使用すると、このプロセス全体が大幅に簡単になり、保守しやすくなります。

于 2011-05-11T19:27:08.253 に答える