我读到一旦创建了非可变数据类型就无法修改。(例如NSString或NSArray)。
但是它们可以重新初始化以指向一组不同的对象吗?
如果是这样,我是否会在两次使用之间使用release从第一轮中释放任何分配?例如:
myArray在接口中声明为NSArray * myArray,并且作为nonatomic / retain property.myArray在初始化代码中设置为指向字符串数组,如下所示。
self.myArray = [myString componentsSeparatedByString:@","];
但后来我想重新初始化myArray以指向一组不同的字符串
self.myArray = [myOtherString componentsSeparatedByString:@","];
有可能吗?感谢...
答案 0 :(得分:2)
这实际上取决于您对重新初始化的意思。您可以将另一个不可变对象分配给指针,因为指针不是常量。
示例:
@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 你就遇到了麻烦。那些是常量字符串,并且不意味着要修改。你可以,如果你真的想要,直接修改对象的内存,但这是危险的,不推荐。如果您需要这样的行为,请使用可变对象。
答案 1 :(得分:0)
当然可以。假设NSArray
是不可变的并不意味着不能更改该类的类的属性。您无法更改内容,但可以为其分配新内容。
如果您还想更改引用,则应使用const
关键字。
答案 2 :(得分:0)
是的,您可以重新初始化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]);