崩溃在NSMutableArray中使用insertObject

时间:2013-04-25 07:26:06

标签: objective-c cocoa nsmutablearray

我有一个NSMUtableArray我希望在不同的索引和不同的方法中插入一些数据。所以我在我的NSMutableArray中初始化我的viewDidLoad

- (void)viewDidLoad
{
    [super viewDidLoad];

    params=[[NSMutableArray alloc]init];
    params =[NSMutableArray arrayWithCapacity:20];
    for (int i = 0; i<20; i++) {

        [params addObject:[NSNull null]];
    }

}

在不同的方法中,我尝试用实际值替换null值:

-(void)doInBackGround{

    NSString * domaine=@"Toto";
    int port =8080;

    [params replaceObjectAtIndex:8 withObject:domaine];

    [params replaceObjectAtIndex:9 withObject:[NSString stringWithFormat:@"%d",nbPort]];

}

我尝试替换NSMutableArray“params”

中的值的另一种方法
-(void)someMethod{

    NSString * computer=@"Ajax";
    int port =3333;

    [params replaceObjectAtIndex:4 withObject:computer];

    [params replaceObjectAtIndex:5 withObject:[NSString stringWithFormat:@"%d",nbPort]];

}

但我遇到了崩溃,我试图替换对象:

[params replaceObjectAtIndex:8 withObject:domaine];

我该如何解决?我认为我的问题是我在NSMUtableArray初始化的地方?你觉得怎么样?

2 个答案:

答案 0 :(得分:2)

首先,你要初始化params两次,第一次完全是多余的,因为你从来没有对空数组做任何事情。

使用arrayWithCapacity:进行第二次初始化会返回自动释放的对象,因此当您尝试替换其中的对象时,它可能已被释放。

熟悉一些内存管理基础知识,并使用数组的保留属性。您可能还希望切换到使用ARC(自动引用计数),这使得此类错误的可能性降低(尽管了解内存管理仍然有用)。

答案 1 :(得分:0)

首先在你对它进行任何修改之前初始化你的params。

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.loginValidated =NO;
    NSLog(@"Affichage Login Form");

  params = [[NSMutableArray arrayWithCapacity:20] retain]; 
   // params =[NSMutableArray arrayWithCapacity:20];
    for (int i = 0; i<20; i++) {

        [params addObject:[NSNull null]];
    }

    // Do any additional setup after loading the view from its nib.

   [self performSelectorInBackground:@selector(doInBackGround) withObject:nil];
}

作为doInBackground的额外提示,您可以阻止无法识别的选择器问题:

-(void)doInBackGround{

    NSString * domaine=@"Toto";
    int nbPort =8080;

    if(params){
       [params replaceObjectAtIndex:8 withObject:domaine];
       [params replaceObjectAtIndex:9 withObject:[NSString stringWithFormat:@"%d",nbPort]];
   }
}