这是一个基本问题,我不确定要搜索什么,看它是否曾被问过。
在很多例子中,我看到财产分配的处理方式如下:
NSArray *tempArray = [/*some code to get array*/];
self.propertyArray = tempArray;
[tempArray release];
为什么不这样做:
self.propertyArray = [/*some code to get array*/];
两者有什么区别?
答案 0 :(得分:1)
在第二个示例中,您不释放属性保留的对象,因此您有内存泄漏。
self.propertyArray = [[SomeClass alloc] init];
// ^ no release
答案 1 :(得分:1)
使用ARC,这两个语句在实践中是等效的(尽管你必须省略释放调用才能在ARC中实际编译)。
在手动管理的内存场景中,你会在第二个中泄漏tempArray("直接分配",它不是因为你正在调用属性设置器而不是设置ivar)例如,因为您没有对 tempArray 进行释放调用以平衡它的alloc / init。
有用的区别在于表现力,调试能力以及最终程序员的个人偏好。
答案 2 :(得分: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):
除了release语句和autorelease语句之外,所有这些方法都是可以接受的。
[tempArray release];
ARC会自动为您处理内存管理,因此您无需明确释放它们。这是ARC的好处,您可以根据需要创建任意数量的对象,而不必试图找出释放它们的位置。
此外,您的财产会有所不同。你必须使用强或弱,而不是保留。在这种情况下,强有力的解决方案。
@property (nonatomic, strong) NSArray *tempArray;
答案 3 :(得分:0)
您的第一个示例是在自动引用计数(ARC)出现之前完成的方式。第二个例子在ARC下工作正常。除非您必须以老式的方式进行,否则请为所有项目选择ARC。
答案 4 :(得分:0)
这样的代码很可能意味着有人想要一种更容易调试的能力。基本上,如果你有一个单独的变量,你可以在调试器中打印它而不触发(可能是自定义的)属性设置器和getter。