为什么在NSArray InitWithObjects期间此代码会因EXC_BAD_ACCESS而崩溃

时间:2011-03-08 04:17:33

标签: iphone objective-c uitableview nsarray

请注意以下代码中的两个NSLOG语句。打印出“aaa”,但“bbb”从未打印过。相反,模拟器与EXC_BAD_ACCESS崩溃。我知道这通常意味着我试图访问的对象过早地被释放。我无法弄清楚出了什么问题......

更新:

这是我的.h

#import <UIKit/UIKit.h>


@interface vcAddCat : UIViewController  <UIPickerViewDataSource, UIPickerViewDelegate> {

NSManagedObjectContext *managedObjectContext;

IBOutlet UIPickerView * pickerView;
NSArray * _weights;
NSArray * _categories;
IBOutlet UILabel *lastCat;
IBOutlet UILabel *lastWeight;

}

我没有任何数组的@property或@synthesize行...

以下是我的.m

中的两个剪辑
- (void)viewDidLoad {

    [super viewDidLoad];
    NSLog(@">>> Entering %s <<<", __PRETTY_FUNCTION__);

    _categories=[[NSArray alloc] initWithObjects: @"Homework",@"Quizzes",@"Tests", @"Mid-Term Exam", nil];
;

    NSLog(@"aaa");

    _weights=[[NSArray alloc] initWithObjects: @"1",@"2",@"3",@"4", @"5", @"6", @"7", @"8", @"9", @"10", @"11", @"11", @"12", @"13", @"14", @"15", @"16", @"17", @"18", @"19", @"20", @"21",@"22",@"23", @"24", @"25", nil];


    NSLog(@"bbb");

..这里是我发布数组的地方......

- (void)dealloc {
[super dealloc];
[_categories release];
[_weights release];
NSLog(@">>> Leaving %s <<<", __PRETTY_FUNCTION__);

}

5 个答案:

答案 0 :(得分:6)

好的 - 输家警报。

对不起,伙计们。当我早期测试只插入10个物体时,一切正常。一旦我开始,我添加了其余的对象(11 - 100),那就是崩溃的时候。当我发布上面的代码时,我将对象列表截断为25个项目 - 似乎太多了。

好吧,对象26,36,46等都有一个拼写错误,我在字符串值之前省略了前面的'@'。

修正了这一点,我又回到了正轨。

感谢您的帮助,并对跛脚错误表示抱歉。

菲尔

答案 1 :(得分:0)

看看问题出在你的_weights数组中。调试代码&amp;当你到达第二个NSLog时检查,数组的值是什么,是否正确保留。你是否将数组作为属性&amp;合成它

在你的.h文件中

NSArray *_weights;

@property( nonatomic, retain ) NSArray  *_weights;

在你的.m文件中

@synthesize _weights

答案 2 :(得分:0)

我只是将确切的代码放入我拥有的应用程序中,它运行得很好。我达到了“bbb”。所以,我的问题是,你是如何定义_weights的?在我的班上,我正在使用:

@interface MyClass : NSObject {
   NSArray* _weights;
}

答案 3 :(得分:0)

请将您的dealloc更改为

- (void)dealloc {
[_categories release];
[_weights release];
[super dealloc];
}

在释放班级的其他对象之前,切勿调用[super dealloc];

答案 4 :(得分:0)

尝试进入可执行文件的参数设置并将NSZombieEnabled转为YES。这将使您的程序停在导致内存访问不良的确切行。