0

我在一个ViewController使用名为 dates 的属性的类中工作,它是一个NSArray,所以在代码中我使用以下方法创建它:

self.dates = someFunctionThatReturnsAnNSArray;

self.dates将继续用于UITableView可搜索的内容。

我还想获取该self.dates数组的副本并使用它来填充AppDelegate名为 globalArray 的属性。所以在我的ViewController我导入 myAppDelegate并调用它的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];

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

4

2 回答 2

0

您的问题的答案在某种程度上取决于所讨论的数组是可变的还是不可变的,以及正在考虑哪种并发性考虑因素(数组是否会被多个线程访问和/或修改)。

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

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

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

于 2013-01-03T03:07:29.693 回答
0

按顺序处理您的问题(包括隐含的问题)

self.dates = someFunctionThatReturnsAnNSArray 有什么作用?

如果该属性被声明为强(ARC)或保留(非 ARC),那么生成的 setter(即您使用点符号使用的)将添加到数组的保留计数中,因此不会垃圾收集。使用综合设置器,您不需要对该语句进行任何进一步的内存管理修饰。

我希望在我的 AppDelegate 中保留一个全局副本。这是一个好主意吗?

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

无论如何,应用程序委托可能不是保存它的好地方。应用程序委托是一个单例,因此很容易将其作为真正应该在应用程序模型中拥有一个家的全局变量的垃圾场。

假设我希望另一个对象具有相同的数组作为属性,我该怎么做?

其他对象(例如应用程序委托,即使我不同意该设计)也可以以与原始对象相同的方式声明属性:非原子、强或保留。当您使用点运算符进行分配时,无需进一步保留。

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

这就像复制一样。它将创建一个新的、不同的集合,其中包含 self.dates 中的相同项目。我对您的问题的猜测是,您真的只想在不同的范围内共享相同的数据。为此,不需要复制或arrayWithArray。

于 2013-01-03T03:48:23.873 回答