NSMutablearray addobject,添加了不期望的对象

时间:2017-03-29 11:41:29

标签: objective-c

我有一个关于NSMutablearray addobject的问题,我认为这是关于对象生命周期的。搜索但没有得到答案。

以下是代码:

    NSMutableString *str1 = [[NSMutableString alloc]init] ;
    NSMutableArray *arr1 = [[NSMutableArray alloc]init] ;
    for (int i=0 ;i<3 ;i++) {
        str1 =[NSMutableString stringWithFormat:@"%ld",(random() % 100) ] ;
        [arr1 addObject:str1] ;
        NSLog(@"arr1 inside loop:%@",arr1) ;
        [str1 setString:@""] ;    }
    NSLog(@"arr1 outside loop:%@",arr1) ;

    NSMutableString *str2 = [[NSMutableString alloc]init] ;
    NSMutableArray *arr2 = [[NSMutableArray alloc]init] ;
    for (int i=0 ;i<3 ;i++) {
        str2 =[NSMutableString stringWithFormat:@"%ld",(random() % 100) ] ;
        [arr2 addObject:str2] ;        }
    [str2 setString:@"abc"] ;
    NSLog(@"arr1:%@",arr2) ;

我希望arr1&amp; arr2都包含3个随机数对象。 但真正的输出是:

arr1 inside loop:(
    83
)
arr1 inside loop:(
    "",
    86
)
arr1 inside loop:(
    "",
    "",
    77
)
arr1 outside loop:(
    "",
    "",
    ""
)
arr2:(
    15,
    93,
    abc
)

Q1:Arr1,为什么添加的对象更改为""? (如果原因是所有3个对象只有3个指针并且它们指向同一个对象,那么我有Q2 - )

Q2:Arr2,为什么arr2的最后一个对象是"abc",而其他对象则不是。{/ p>

谢谢!

2 个答案:

答案 0 :(得分:2)

  

Q1:Arr1,为什么添加的对象更改为&#34;&#34;?

每次使用[NSMutableString stringWithFormat:@"%ld",(random() % 100) ] ;时,您都创建了一个新的NSMutableString对象并更改了str1的指针,因此它会指向到该新对象。

但是,当您使用[str1 setString:@""] ;时,您更改了str1的对象值,因此您也更改了数组对象值,因为[arr1 addObject:str1] ;添加了{{1}仅指向str1数组的指针。

  

Q2:Arr2,为什么arr2的最后一个对象是&#34; abc&#34;但其他人没有。

这是您的代码arr1{分隔的行:

}

您正在使用for (int i=0 ;i<3 ;i++) { str2 =[NSMutableString stringWithFormat:@"%ld",(random() % 100) ]; [arr2 addObject:str2] ; } [str2 setString:@"abc"] ; NSLog(@"arr1:%@",arr2) ; 创建新对象并更改[NSMutableString stringWithFormat:@"%ld",(random() % 100) ];指针,并将其指针添加到str2中的arr2

[arr2 addObject:str2] ;之后,您使用for[str2 setString:@"abc"]指向您在str2内创建的最后一个对象,这是您添加到的最后一个项目数组。

答案 1 :(得分:0)

[str1 setString:@""]修改已添加到数组的字符串。在第一步中,您有一个值为"83"的可变字符串,但在迭代结束时,您将使用空字符串""重写此相同的可变字符串。

您可以删除该行,因为您不再使用相同的实例,实际上,您根本不需要可变字符串:

for (int i = 0; i < 3; i++) {
   NSString *randomString = [NSString stringWithFormat:@"%ld", (random() % 100)] ;
   [arr1 addObject:randomString];
   NSLog(@"arr1 inside loop:%@", arr1);
}