我读到不可变的数据类型一旦创建就不能修改(例如NSString或NSArray)。
但是,它们是否可以重新初始化以指向不同的对象集?
如果是这样,我是否使用release从两次使用之间的第一轮释放任何分配?例如:
在接口中声明为NSArray *myArray的myArray,在初始化代码中设置为指向字符串数组的指针的非原子/保留property.myArray,如下所示。
self.myArray = [myString componentsSeparatedByString:@","];但是稍后我想重新初始化myArray以指向一组不同的字符串
self.myArray = [myOtherString componentsSeparatedByString:@","];有可能吗?谢谢..。
发布于 2010-01-12 15:13:25
是的,您可以重新初始化NSArray。下面是我用来重新初始化NSArray的示例代码。
NSString *keywords = @"FirstName|LastName|Address|PhoneNumber";
NSArray *arr = [keywords componentsSeparatedByString:@"|"];
NSLog(@"First Init - %@,%@,%@,%@",[arr objectAtIndex:0],[arr objectAtIndex:1],
[arr objectAtIndex:2],[arr objectAtIndex:3]);
arr = nil;
keywords = @"First_Name|Last_Name|_Address|_PhoneNumber";
arr = [keywords componentsSeparatedByString:@"|"];
NSLog(@"Second Init - %@,%@,%@,%@",[arr objectAtIndex:0],[arr objectAtIndex:1],
[arr objectAtIndex:2],[arr objectAtIndex:3]);发布于 2010-01-12 15:29:07
这真的取决于你对重新初始化的意思。您可以将另一个不可变对象赋给指针,因为指针不是常量。
示例:
@interface MyObj : NSObject {
NSString *name; // not needed in 64bit runtime AFAIK
}
@property(retain) NSString *name; // sane people use copy instead of retain
// whenever possible. Using retain can
// lead to some hard to find errors.
@end
/* ... another file ... */
MyObj *theObject = [[[MyObj alloc] init] autorelease];
theObject.name = @"Peter";
NSString *oldName = theObject.name;
NSLog(@"%@", theObject.name); // -> Peter
NSLog(@"%@", oldName); // -> Peter
theObject.name = @"Martin";
NSLog(@"%@", theObject.name) // -> Martin
NSLog(@"%@", oldName) // -> Peter如果上面的行为是你想要的,那也没问题。
如果你想让最后一行返回,,Martin,,,你有麻烦了,,这些是常量字符串,不能修改。如果你真的想要,你可以直接修改对象的内存,但这是危险的,不推荐这样做。如果你需要这样的行为,可以使用可变对象。
发布于 2010-01-12 14:58:01
他们当然可以。声明NSArray是不可变的并不意味着该类型的类的属性不能改变。您不能更改内容,但可以为其分配新内容。
如果你想让改变引用成为可能,你应该使用const关键字。
https://stackoverflow.com/questions/2047243
复制相似问题