Objective C / iPhone:是否可以重新初始化NSArray?

时间:2010-01-12 06:53:52

标签: objective-c arrays memory-management reusability

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

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

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

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

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

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

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

有可能吗?感谢...

3 个答案:

答案 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]);