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

Posted

技术标签:

【中文标题】Objective C /iPhone:是不是可以重新初始化 NSArray?【英文标题】:Objective C /iPhone : Is it possible to re initialize an NSArray?Objective C /iPhone:是否可以重新初始化 NSArray? 【发布时间】:2010-01-12 06:53:51 【问题描述】:

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

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

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

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

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

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

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

有可能吗?谢谢...

【问题讨论】:

您显示的不是重新初始化,而是分配一个新的。重新初始化可能可以使用一些非常肮脏的技巧,通过用新的数组对象替换数组对象而不更改内存地址。 【参考方案1】:

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

例子:

@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】:

是的,您可以重新初始化 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]);

【讨论】:

又一个错误的例子!您不得释放该数组,因为您没有通过使用alloc/copy*/new*!当数组自动释放时,这将在未来某个时间抛出 EXC_BAD_ACCESS 或类似的东西! 为什么不只使用 NSLog 数组呢?为什么要单独打印每个对象? (除此之外,+1)【参考方案3】:

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

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

【讨论】:

但这不是数组的重新初始化。它正在创建一个新实例并分配指向该新实例的指针。非常不同。

以上是关于Objective C /iPhone:是不是可以重新初始化 NSArray?的主要内容,如果未能解决你的问题,请参考以下文章

跟踪 iphone 的位置并通知是不是在 ios Objective C 中越过某些公里

音频文件可以像照片和电影一样使用objective C保存在iphone中吗?

如何使用 Objective C 在 iphone 中制作 .zip 文件?

iPhone Objective C - 保存数据

Objective C iPhone:打开PDF不再起作用

如何用 Objective-C 判断 iPhone 是不是连接到 wifi 网络?