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中吗?