为什么要创建变量而不是直接赋值?

时间:2012-04-22 15:02:24

标签: iphone objective-c ios

这是一个基本问题,我不确定要搜索什么,看它是否曾被问过。

在很多例子中,我看到财产分配的处理方式如下:

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

为什么不这样做:

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

两者有什么区别?

5 个答案:

答案 0 :(得分:1)

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

self.propertyArray = [[SomeClass alloc] init];
//                               ^ no release

答案 1 :(得分:1)

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

在手动管理的内存场景中,你会在第二个中泄漏tempArray("直接分配",它不是因为你正在调用属性设置器而不是设置ivar)例如,因为您没有对 tempArray 进行释放调用以平衡它的alloc / init。

有用的区别在于表现力,调试能力以及最终程序员的个人偏好。

答案 2 :(得分:1)

这个答案假设您没有使用ARC。

第一个代码片段是App​​le建议初始化属性的方式,只要你在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 (nonatomic, strong) NSArray *tempArray;

答案 3 :(得分:0)

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

答案 4 :(得分:0)

这样的代码很可能意味着有人想要一种更容易调试的能力。基本上,如果你有一个单独的变量,你可以在调试器中打印它而不触发(可能是自定义的)属性设置器和getter。