这是一个基本问题,我不确定要搜索什么以查看以前是否有人问过它。
在很多示例中,我看到过这样处理属性分配:
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):
除了 release 语句和 autorelease 语句外,所有这些方法都是可以接受的。
[tempArray release];
ARC 自动为您管理内存,因此您不必显式释放它们。这就是 ARC 的好处,您可以根据需要创建任意数量的对象,而无需为弄清楚在哪里释放它们而头疼。
此外,您的属性(property)也会有所不同。您必须使用强或弱,而不是保留。在这种情况下,强大的解决方案。
@property (nonatomic, strong) NSArray *tempArray;
关于iphone - 为什么要创建一个变量而不是直接赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10269030/