我有一个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
初始化的地方?你觉得怎么样?
答案 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]];
}
}