如何从整数值中获取NSMutableArray ObjectAtIndex中的数据?

时间:2013-07-17 06:54:39

标签: iphone ios objective-c nsmutablearray nsarray

我想从我的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

任何想法或建议都将受到高度赞赏。

4 个答案:

答案 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_Answervar_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 ++;
}