我有一个关于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>
谢谢!
答案 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);
}