将NSNumber添加到阵列时出错

时间:2010-09-25 13:11:05

标签: objective-c arrays integer exc-bad-access nsnumber

当我的程序到达时: [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 个答案:

答案 0 :(得分:3)

当您尝试访问已取消分配的成员时,通常会发生

EXC_BAD_ACCESS。因为您在init函数中调用[NSMutableArray arrayWithCapacity:],所以在调用logSequenceNumber:(id)sender时可能已经释放了它。尝试将@property (nonatomic, retain) NSMutableArray* userNumSequence添加到@interface@synthesize userNumSequence添加到@implementation。然后在init方法中调用self.userNumSequence = [NSMutableArray arrayWithCapacity:0]。不要忘记在dealloc中将其设置为nil

编辑:另外,要明确Cocoa memory management命名标准是这样的:

  1. 如果您致电[[Object alloc] initSomehow][object retain],则您有责任发布(致电init方法会自动致电retain)。
  2. 如果您调用类似[Object objectWithSomething:something]的方法,这些方法通常是自动释放的,将来会发布。你永远不应该假设这些存在超出创建它们的范围。根据Cocoa文档,范围包括调用堆栈。如果a:调用调用b:的{​​{1}},并且c:返回自动释放的对象,则可以安全地将其传递回c:以供使用。除此之外,它被释放。这至少是我对自动释放的解释的解释。
  3. 如果您需要在对象的生命周期内使用某些内容,请在获取对象时将其保留并在a:中释放。