1

我读到非可变数据类型一旦创建就不能修改。(例如 NSString 或 NSArray)。

但是可以重新初始化它们以指向不同的对象集吗?

如果是这样,我是否使用 release 从第一次使用之间释放任何分配?例如:

myArray 在接口中声明为 NSArray *myArray,并在初始化代码中设置为 nonatomic/retain property.myArray 指向一个字符串数组,如下所示。

self.myArray = [myString componentsSeparatedByString:@","];

但后来我想重新初始化 myArray 以指向一组不同的字符串

self.myArray = [myOtherString componentsSeparatedByString:@","];

是否可以?谢谢...

4

3 回答 3

2

这真的取决于你对re-initialize 的意思。您可以将另一个不可变对象分配给指针,因为指针不是常量。

例子:

@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-12T07:29:06.590 回答
0

他们当然可以。说 anNSArray是不可变的并不意味着该类型的类的属性不能更改。您无法更改内容,但可以为其分配新内容。

如果你想让引用也无法更改,你应该使用const关键字。

于 2010-01-12T06:58:01.193 回答
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]);
于 2010-01-12T07:13:24.833 回答