在ObjC中将对象设置为另一个对象的值的正确方法是什么?

时间:2013-01-03 02:58:49

标签: objective-c object

我在ViewController类中工作,该类使用名为dates的属性,它是NSArray,因此在代码中我使用以下命令创建它:

self.dates = someFunctionThatReturnsAnNSArray;

self.dates继续在可搜索的UITableView中使用。

我还要获取该self.dates数组的副本,并使用它来填充名为globalArray的AppDelegate属性。因此,在我的ViewController我导入AppDelegate并调用其sharedApplication方法然后执行此操作:

AppDelegate *myDelegate = [[UIApplication sharedApplication] delegate];
myDelegate.globalArray = self.dates;

我的问题是,这是正确的方法吗?复制或保留怎么样?

myDelegate.globalArray = [self.dates copy];
myDelegate.globalArray = [self.dates retain];

或者globalArray = arrayWithArray呢?

myDelegate.globalArray = [NSArray arrayWithArray:self.dates];

推荐的格式是什么?为什么?

2 个答案:

答案 0 :(得分:0)

您的问题的答案在某种程度上取决于所讨论的数组是否可变或不可变以及正在使用何种并发注意事项(数组是否会被多个线程访问和/或修改)

您似乎也使用非ARC语法,可能需要考虑使用ARC。

如果数组是不可变的,那么保留数组的副本应该没问题。如果它们是可变的(并且您希望能够分别跟踪这两个数组),那么您将需要进行复制。

如果真的意图是应该全局使用一组数据(一个主数组),那么您可能只想在视图控制器上放一些方便的方法来访问主数组(并避免使用二,单独的指针)。

答案 1 :(得分:0)

按顺序提出问题(包括隐含的问题)

  

self.dates = someFunctionThatReturnsAnNSArray做什么?

如果属性声明为强(ARC)或保留(非ARC),那么生成的setter(您正在使用点符号)将添加到数组的保留计数,以便赢得不被垃圾收集。使用合成的setter,您不需要在该语句上进行任何进一步的内存管理修饰。

  

我想在AppDelegate中将副本保存为全局副本。这是个好主意吗?

“复制”在OO中可能是一个棘手的术语。它可能意味着通过说[array copy]得到的相同项目的另一个不同的集合。它可能意味着所有项目的新副本集合。你可能不想要其中任何一个。我的猜测是你只想要一个指向不同范围内可用数组的指针。这通常称为“分配”数组。

在任何情况下,应用代表可能都不是保留它的好地方。 App委托是一个单身人士,所以很容易让它成为真正应该在应用程序模型中拥有主页的全局变量的倾销场所。

  

假设我想让另一个对象拥有与属性相同的数组,我该怎么做?

其他对象(就像app委托,即使我不同意该设计)也可以声明属性与原始属性相同:nonatomic,strong或retain。使用点运算符进行赋值时,不需要进一步保留。

  

someArray = [NSArray arrayWithArray:self.dates]怎么样?那有什么不同?

就像复制一样。它将创建self.dates中相同项目的新的,不同的集合。我的猜测是你真的只想在不同的范围内共享相同的数据。为此,不需要copy或arrayWithArray。