首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >目标C /iPhone :是否可以重新初始化NSArray?

目标C /iPhone :是否可以重新初始化NSArray?
EN

Stack Overflow用户
提问于 2010-01-12 14:53:52
回答 3查看 1.3K关注 0票数 1

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

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

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

在接口中声明为NSArray *myArray的myArray,在初始化代码中设置为指向字符串数组的指针的非原子/保留property.myArray,如下所示。

代码语言:javascript
运行
复制
self.myArray = [myString componentsSeparatedByString:@","];

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

代码语言:javascript
运行
复制
self.myArray = [myOtherString componentsSeparatedByString:@","];

有可能吗?谢谢..。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-01-12 15:13:25

是的,您可以重新初始化NSArray。下面是我用来重新初始化NSArray的示例代码。

代码语言:javascript
运行
复制
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]);
票数 0
EN

Stack Overflow用户

发布于 2010-01-12 15:29:07

这真的取决于你对重新初始化的意思。您可以将另一个不可变对象赋给指针,因为指针不是常量。

示例:

代码语言:javascript
运行
复制
@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,,你有麻烦了,,这些是常量字符串,不能修改。如果你真的想要,你可以直接修改对象的内存,但这是危险的,不推荐这样做。如果你需要这样的行为,可以使用可变对象。

票数 2
EN

Stack Overflow用户

发布于 2010-01-12 14:58:01

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

如果你想让改变引用成为可能,你应该使用const关键字。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2047243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档