0

这是一个基本问题,我不确定要搜索什么来查看之前是否有人问过它。

在很多例子中,我见过这样处理的属性分配:

NSArray *tempArray = [/*some code to get array*/];
self.propertyArray = tempArray;
[tempArray release];

为什么不这样做:

self.propertyArray = [/*some code to get array*/];

两者有什么区别?

4

5 回答 5

1

这个答案是假设你不使用 ARC。

第一个代码片段是 Apple 推荐的初始化属性的方式,只要您在 init 之外的任何方法中执行此操作即可。您会注意到 Apple 代码片段经常这样做。它让你更容易管理你的记忆,而且在我看来它更容易阅读。

NSArray *tempArray = [[NSArray alloc] initWith....]
self.propertyArray = tempArray;
[tempArray release];

您拥有的第二个代码片段可能会导致内存泄漏,具体取决于您设置 NSArray 的方式。

这将是一个泄漏。propertyArray 的保留计数为 2。在 dealloc 中释放实例变量后,保留计数仍为 1。这是泄漏。

self.propertyArray = [[NSArray alloc] initWith...];

这没关系,因为它们都被自动释放,这将使您的保留计数为 1。只要您在 dealloc 中释放实例变量。

// Class Method so autoreleased
self.propertyArray = [NSArray arrayWith....];

// Explicitly declaring autorelease
self.propertyArray = [[[NSArray alloc] initWith.....] autorelease];

这只是一个偏好问题。我更喜欢第一种方式,我认为它更容易阅读和遵循。

编辑(使用 ARC):

除了发布声明和自动发布声明之外,所有这些方法都是可以接受的。

[tempArray release];

ARC 会自动为您处理内存管理,因此您不必显式释放它们。这是 ARC 的好处,您可以创建任意数量的对象,而无需费力找出释放它们的位置。

此外,您的财产会有所不同。您必须使用强或弱,而不是保留。在这种情况下,强将是解决方案。

@property (nonatomic, strong) NSArray *tempArray;
于 2012-04-22T18:04:52.430 回答
1

在第二个示例中,您没有释放由属性保留的对象,因此存在内存泄漏。

self.propertyArray = [[SomeClass alloc] init];
//                               ^ no release
于 2012-04-22T15:06:22.087 回答
1

使用 ARC,这两个语句在实践中是等效的(尽管您必须省略发布调用才能在 ARC 中实际编译)。

在手动托管内存场景中,您将在第二个示例中泄漏 tempArray(“直接分配”,这不是因为您调用的是属性设置器而不是设置 ivar)示例,因为您没有对tempArray的释放调用平衡它的分配/初始化。

有用的区别被简化为表达能力、调试能力以及最终程序员的个人偏好。

于 2012-04-22T17:20:00.220 回答
0

像这样的代码很可能意味着有人想要更容易调试它的能力。基本上,如果您有一个单独的变量,则可以在调试器中将其打印出来,而无需触发(可能是自定义的)属性设置器和获取器。

于 2012-04-22T16:54:28.790 回答
0

您的第一个示例是在自动引用计数 (ARC) 出现之前完成的方式。第二个示例在 ARC 下运行良好。除非您必须以老式方式进行操作,否则请为您的所有项目选择 ARC。

于 2012-04-22T15:59:46.090 回答