0

私のプログラムが次の行に到達したとき: [userNumSequence addObject:[NSNumber numberWithInteger: sequenceNumber]]; エラーが発生します:プログラムは信号を受け取りました:「EXC_BAD_ACCESS」。

私がやりたいのは、配列に整数を格納することだけです。

//  JBNumberGeneration.m

#import "JBNumberGeneration.h"


@implementation JBNumberGeneration

- (id) init{ 
    if (self = [super init]){ 
        userNumSequence = [NSMutableArray arrayWithCapacity:0]; 
    } return self; 
}

-(IBAction)logSequenceNumber:(id)sender{
    NSString *titleOfButton = [sender title];
    int sequenceNumber = [titleOfButton integerValue];
    i=0;

    [userNumSequence addObject:[NSNumber numberWithInteger: sequenceNumber]];

    //int currentNum = [((NSNumber*)[userNumSequence objectAtIndex: i]) integerValue];
    //NSLog(@"%i", currentNum);

    int count = [userNumSequence count];
    NSLog(@"Array size: %i", count);

    i++;
}
@end

//  JBNumberGeneration.h

#import <Cocoa/Cocoa.h>


@interface JBNumberGeneration : NSObject {
    IBOutlet NSTextField *displayLabel;
    int randNum;
    int level;
    int i;
    NSMutableArray* userNumSequence;
}

-(IBAction)logSequenceNumber:(id)sender;
@end
4

1 に答える 1

3

EXC_BAD_ACCESS通常、既に割り当てが解除されているメンバーにアクセスしようとすると発生します。init 関数を呼び出しているため、呼び出さ[NSMutableArray arrayWithCapacity:]れるまでに既に解放されている可能性があります logSequenceNumber:(id)sender。とに追加@property (nonatomic, retain) NSMutableArray* userNumSequenceしてみてください。次に、init メソッドを呼び出します。dealloc で設定することを忘れないでください。@interface@synthesize userNumSequence@implementationself.userNumSequence = [NSMutableArray arrayWithCapacity:0]nil

編集: また、明確にするために、Cocoa メモリ管理の命名基準は次のようになります。

  1. を呼び出す場合[[Object alloc] initSomehow]、または[object retain]それを解放する責任がある場合 (initメソッドを呼び出すと、自動的に が呼び出されますretain)。
  2. のようなメソッドを呼び出すと[Object objectWithSomething:something]、これらは通常自動解放され、将来いつか解放されます。これらが作成された範囲を超えて存在すると想定しないでください。Cocoa のドキュメントによると、スコープにはコール スタックが含まれます。a:which を呼び出しb:て を呼び出しc:c:自動解放されたオブジェクトを返す場合、安全に渡して使用することができますa:。それを超えてリリースされます。これは、少なくとも autorelease の説明に対する私の解釈です。

オブジェクトの存続期間中に何かを使用する必要がある場合は、それを取得したときにそれを保持し、 で解放しdeallocます。

于 2010-09-25T13:19:06.133 に答える