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