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通常在您尝试访问已被释放的成员时发生。因为您正在调用[NSMutableArray arrayWithCapacity:]init 函数,所以在调用时它可能已经被释放 logSequenceNumber:(id)sender。尝试添加@property (nonatomic, retain) NSMutableArray* userNumSequence到您的@interface@synthesize userNumSequence您的@implementation. 然后调用self.userNumSequence = [NSMutableArray arrayWithCapacity:0]你的 init 方法。不要忘记将其设置为nil在 dealloc 中。

编辑:另外,为了清楚Cocoa 内存管理命名标准是这样的:

  1. 如果你调用[[Object alloc] initSomehow],或者[object retain]你负责释放它(调用init方法会自动调用retain)。
  2. 如果你调用类似的方法[Object objectWithSomething:something],这些通常是自动释放的,并且会在未来的某个时间被释放。你永远不应该假设它们存在于它们被创建的范围之外。根据 Cocoa 文档,范围包括调用堆栈。如果a:调用b:which 调用c:,并c:返回一个自动释放的对象,它可以一直安全地传递回去以供a:使用。除此之外,它被释放。这至少是我对自动释放的解释的解释。

如果您需要在对象的生命周期内使用某些东西,请在获取时保留它并在dealloc.

于 2010-09-25T13:19:06.133 回答