目标C / iPhone:是否有可能重新初始化一个NSArray?
-
20-09-2019 - |
题
我读到非可变的数据类型不能被修改创建一次。(例如的NSString或NSArray的)。
但是,它们可以被重新初始化,以指向一组不同的对象?
如果是这样,我用的释放,以释放从第一次圆任何在页头之间使用?例如:
myArray的声明为的NSArray * myArray的接口,并且作为非原子/保持在初始化代码property.myArray集到一个点到字符串数组如下:
self.myArray = [myString componentsSeparatedByString:@","];
但后来我想重新初始化myArray的指向一个不同的组字符串
self.myArray = [myOtherString componentsSeparatedByString:@","];
,可以吗?感谢...
解决方案
是的,你可以重新初始化的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]);
其他提示
这真的取决于你的意思用的重新初始化的。可以分配的另一个不可变的对象的指针,因为指针不是恒定的。
示例:
@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
如果上述行为是你想要的,这很好。
如果您想最后一行返回的马丁的你就麻烦了。这些都是常量字符串,并的不的意思修改。你可以,如果你真的想,直接修改对象的内存,但的这是危险的的,不推荐。如果你需要这样的行为,使用可变对象。
当然,他们可以。说的NSArray
是不可变的,并不意味着一类类型的的属性不能改变。你不能改变的内容,但您可以指定新的内容给它。
如果你想改变也不可能,你应该使用const
关键字的引用。
不隶属于 StackOverflow