我读到非可变的数据类型不能被修改创建一次。(例如的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关键字的引用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top