这是一个基本问题,我不确定要搜索什么来查看之前是否有人问过它。
在很多例子中,我见过这样处理的属性分配:
NSArray *tempArray = [/*some code to get array*/];
self.propertyArray = tempArray;
[tempArray release];
为什么不这样做:
self.propertyArray = [/*some code to get array*/];
两者有什么区别?
这是一个基本问题,我不确定要搜索什么来查看之前是否有人问过它。
在很多例子中,我见过这样处理的属性分配:
NSArray *tempArray = [/*some code to get array*/];
self.propertyArray = tempArray;
[tempArray release];
为什么不这样做:
self.propertyArray = [/*some code to get array*/];
两者有什么区别?
这个答案是假设你不使用 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;
在第二个示例中,您没有释放由属性保留的对象,因此存在内存泄漏。
self.propertyArray = [[SomeClass alloc] init];
// ^ no release
使用 ARC,这两个语句在实践中是等效的(尽管您必须省略发布调用才能在 ARC 中实际编译)。
在手动托管内存场景中,您将在第二个示例中泄漏 tempArray(“直接分配”,这不是因为您调用的是属性设置器而不是设置 ivar)示例,因为您没有对tempArray的释放调用平衡它的分配/初始化。
有用的区别被简化为表达能力、调试能力以及最终程序员的个人偏好。
像这样的代码很可能意味着有人想要更容易调试它的能力。基本上,如果您有一个单独的变量,则可以在调试器中将其打印出来,而无需触发(可能是自定义的)属性设置器和获取器。
您的第一个示例是在自动引用计数 (ARC) 出现之前完成的方式。第二个示例在 ARC 下运行良好。除非您必须以老式方式进行操作,否则请为您的所有项目选择 ARC。