【问题标题】:Getting error when added NSNumber to an array将 NSNumber 添加到数组时出错
【发布时间】:2010-09-25 13:11:04
【问题描述】:

当我的程序到达该行时: [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

【问题讨论】:

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


    【解决方案1】:

    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: 调用c:,并且c: 返回一个自动释放的对象,它可以一直安全地传递给a: 使用。除此之外,它被释放。这至少是我对自动释放的解释的解释。

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

    【讨论】:

    • 没问题。如果您不习惯,Objective-C 内存管理可能会有点奇怪。
    • 对不起,你错了。 init 不会自动调用retain。 Alloc 具有隐式保留,而不是 init。在 init 中使用属性也被认为是一个坏主意。在这种情况下,在 init 中分配和初始化数组要好得多。
    • 我的意思是,你在这两个具体问题上是错误的。你是正确的,数组没有保留在提问者的代码中,这就是它消失的原因。
    • @Jeremy。很高兴知道。我知道 [[alloc] init] 调用确实保留了,但我只是试了一下并猜到了 init 称为保留。另外,为什么在 init 中使用属性被认为是一个坏主意?这只是对释放当前实例、保留新实例并将其分配给 ivar 的 setter 的调用。
    • 您不能确定setter 只是 释放旧值,保留新值并将值设置为新值。 setter 是一种 Objective-C 方法,可以做任何它喜欢的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    • 2016-02-27
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    相关资源
    最近更新 更多