Получение ошибки при добавлении NSNumber в массив - PullRequest
0 голосов
/ 25 сентября 2010

Когда моя программа попадает в строку: [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

1 Ответ

3 голосов
/ 25 сентября 2010

EXC_BAD_ACCESS обычно происходит, когда вы пытаетесь получить доступ к члену, который уже был освобожден. Поскольку вы вызываете [NSMutableArray arrayWithCapacity:] в своей функции инициализации, она может быть уже освобождена к моменту вызова logSequenceNumber:(id)sender. Попробуйте добавить @property (nonatomic, retain) NSMutableArray* userNumSequence к @interface и @synthesize userNumSequence к @implementation. Затем вызовите self.userNumSequence = [NSMutableArray arrayWithCapacity:0] в вашем методе init. Не забудьте установить значение nil в dealloc.

РЕДАКТИРОВАТЬ: Кроме того, просто для ясности Управление памятью какао стандарты именования таковы:

  1. Если вы звоните [[Object alloc] initSomehow] или [object retain], вы отвечаете за его освобождение (вызов методов init автоматически вызовет retain).
  2. Если вы вызываете методы, такие как [Object objectWithSomething:something], они обычно автоматически высвобождаются и будут выпущены в будущем. Вы никогда не должны предполагать, что они существуют за рамками их создания. Согласно документации Какао, область действия включает в себя стек вызовов. Если a: вызывает b:, что вызывает c:, а c: возвращает автоматически освобожденный объект, его можно безопасно передать обратно до использования a:. Помимо этого это выпущено. Это, по крайней мере, моя интерпретация объяснения авто-выпуска.

Если вам нужно что-то использовать на протяжении жизни вашего объекта, сохраните его, когда получите, и отпустите в dealloc.

...