0

我有一个NSMUtableArray我想在不同的索引和不同的方法插入一些数据的地方。所以我NSMutableArrayviewDidLoad这样初始化我的:

- (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“参数”中的值的另一种方法

-(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? 你怎么看?

4

2 回答 2

2

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

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

熟悉一些内存管理基础知识并使用数组的保留属性。您可能还想切换到使用 ARC(自动引用计数),这样可以减少这种错误的可能性(尽管了解内存管理仍然很有帮助)。

于 2013-04-25T07:37:20.093 回答
0

在对其进行任何修改之前,首先初始化您的参数 ivar。

- (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]];
   }
}
于 2013-04-25T08:29:37.183 回答