我想从我的NSMutableArray中获取数据,我正在这样做
-(void)ViewDidLoad{
A_array = [[NSMutableArray alloc] init];
A_array = [NSMutableArray arrayWithObjects:@"4",@"6",@"2",@"3",@"0",@"5",@"1",@"2",@"4",@"1",@"0",@"2",@"4",@"2",@"0",@"3",nil]
var_Count_Answer_A = 0; // int
}
-(void)method_Second {
NSLog(@"%@",[A_array objectAtIndex:var_Count_Answer_A]); // This line is crashing if I click button again. First time line works fine but if we click button again and var_Count_Answer = 2 then it will crash.
NSString *str1 = [[NSString alloc]initWithFormat:@"%@",[A_array objectAtIndex:var_Count_Answer_A]]; // If I comment on NSLOG then this line will crash
A = [str1 integerValue];
NSLog(@"A is %d",A);
var_Count_Answer_A ++;
}
如果我试试这个NSLog(@"%@",[A_array objectAtIndex:5]); // works fine
NSLog(@"%@",[A_array objectAtIndex:var_Count_Answer_A]); // var_Count_Answer_A =5; and crash
任何想法或建议都将受到高度赞赏。
答案 0 :(得分:3)
你的代码伤害了我的眼睛
在Objective-C中编写代码时,需要遵循某些编码标准。每种语言都有一种。它们使代码易读且易于理解。您可以参考Cocoa Coding Guidelines并帮助自己编写更好看的代码。
正确解释
在崩溃之前没有错误消息没有人可以帮助你。下次发布崩溃时,还要解释您收到的错误消息。
是EXEC_BAD_ACCESS
吗?如果是这样的话,那就是令人敬畏的垃圾收集器将你的数组对象扫除。无论如何,你的代码让我眼前一亮,我正在享受重构代码的特权。也许它会帮助你。
一点点重构
NSArray *aArray;
- (void)viewDidLoad
{
[super viewDidLoad];
aArray = @[@"1", @"2", @"3", @"4"];
// or use[[NSArray alloc]initWithObjects:@"1", @"2", @"3", @"4", @"5"];
//Why do you need a mutable array while initializing it static?
}
- (void)methodSecond
{
static int counter = 0;
if (aArray) {
if (counter<aArray.count) {
NSLog(@"A is %u",[[aArray objectAtIndex:counter++]integerValue]);
} else {
counter = 0;
[self methodSecond];
}
}
}
了解您在做什么
详细解释我猜你的问题是什么:
你正在使用[NSArray initWithObjects:]这会创建一个自动释放的对象,我们无法控制它的生命周期。如果在创建后没有立即引用它们,它们就会被释放,这可能是你的情况。根据我的经验,可变的自动释放对象总是会导致糟糕的访问问题。所以最好有对象alloc和inited,即.. [[NSArray alloc] initWithObjects:]并且我观察到你没有在运行时添加/删除数组成员。没有MutableArray的目的。
在您的代码中,您正在创建两个对象。第一个数组对象被分配并在下一行中立即解除引用。这可能是一个错误。
如果您想了解有关自动释放对象的更多信息。阅读this。
答案 1 :(得分:1)
使用
A_array = [[NSMutableArray alloc] initWithObjects:@"4",@"6",@"2",@"3",@"0",@"5",@"1",@"2",@"4",@"1",@"0",@"2",@"4",@"2",@"0",@"3",nil];
相反,你使用过。
A_array = [[NSMutableArray alloc] init];
A_array = [NSMutableArray arrayWithObjects:@"4",@"6",@"2",@"3",@"0",@"5",@"1",@"2",@"4",@"1",@"0",@"2",@"4",@"2",@"0",@"3",nil];
当我审核你的项目是ARC禁用时,试试这个工作正常。
ViewControler.h
@interface MasterViewController : UIViewController
{
NSMutableArray *A_array;
int var_Count_Answer_A;
}
ViewControler.m
-(void)viewDidLoad {
[super viewDidLoad];
A_array = [[NSMutableArray alloc] initWithObjects:@"4",@"6",@"2",@"3",@"0",@"5",@"1",@"2",@"4",@"1",@"0",@"2",@"4",@"2",@"0",@"3",nil];
var_Count_Answer_A = 0;
var_Count_Answer_A = 0; // int
}
-(IBAction)method_Second:(id)sender {
NSLog(@"%@",[A_array objectAtIndex:var_Count_Answer_A]);
NSString *str1 = [[NSString alloc]initWithFormat:@"%@",[A_array objectAtIndex:var_Count_Answer_A]]; // If I comment on NSLOG then this line will crash
int A = [str1 integerValue];
NSLog(@"A is %d",A);
var_Count_Answer_A++;
}
但是每个人都知道最后必定会发生这种异常。
NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 16 beyond bounds [0 .. 15]'
尝试访问不存在的数组索引对象。
And if you still have some error then First Enable NSZombie in your project Follow this.
- &GT;在“Product
”菜单中选择“Edit Scheme
”,转到左侧面板中的“YourAp.app
”阶段,然后转到右侧的“Arguments
”标签。然后,您可以将NSZombieEnabled
添加到“Environment Variables
”部分,并将值设置为YES
。
And Now Share your Crash Log.
答案 2 :(得分:0)
在您的代码中,一旦检查这两个变量,您将使用两个不同的变量。
var_Count_Answer
和var_Count_Answer_A
答案 3 :(得分:0)
发生此错误是因为您使用的是自动释放对象。 当您打电话时:
A_array = [NSMutableArray arrayWithObjects:@"4",@"6",@"2",@"3",@"0",@"5",@"1",@"2",@"4",@"1",@"0",@"2",@"4",@"2",@"0",@"3",nil]
A_array是一个自动释放的对象,你不能说什么时候它会被释放。这就是发生此错误的原因。
解决方案:
为数组声明一个属性,如:
@property (nonatomic, strong) NSMutableArray *A_array;
然后修改您的方法,如:
-(void)ViewDidLoad
{
_A_array = [NSMutableArray arrayWithObjects:@"4",@"6",@"2",@"3",@"0",@"5",@"1",@"2",@"4",@"1",@"0",@"2",@"4",@"2",@"0",@"3",nil]
var_Count_Answer_A = 0; // int
}
-(void)method_Second
{
NSLog(@"%@",[_A_array objectAtIndex:var_Count_Answer_A])
NSString *str1 = [[NSString alloc]initWithFormat:@"%@",[_A_array objectAtIndex:var_Count_Answer_A]];
A = [str1 integerValue];
NSLog(@"A is %d",A);
var_Count_Answer_A ++;
}