Iphone设置属性的正确方法

时间:2011-01-11 22:50:17

标签: iphone memory-management

我在.h中有以下代码:

@property (nonatomic, retain) NSArray *arrayData;

在方法initWithNibName中的.m:

self.arrayData = [NSArray arrayWithObjects:@"Usuario:",@"Password:",nil];

是正确的,以致于

[self.arrayData release]

安全地释放对象?

3 个答案:

答案 0 :(得分:1)

您需要致电:

[arrayData release]

调用[self.arrayData release];在任何一种情况下都不会产生你想要的效果。

如果您想知道原因是什么,请查看以下问题:difference between [self.property release] and [property release]

答案 1 :(得分:1)

不,在您的财产上致电释放是不正确的。它的问题是,你释放你的属性,它将被释放,但你没有将指针设置为nil,所以有人可能会向你的属性发送消息并导致崩溃。

您可以做的是:

  1. self.arrayData = nil; (将释放先前保存的实例,并将属性设置为nil)
  2. [arrayData release]; arrayData = nil; (在这里你要访问你的ivar而不是你的财产;将你的ivar设置为零是一个预防措施)
  3. [self-> arrayData release]; self-> arrayData = nil(这与#2完全相同)
  4. 希望这有帮助。

答案 2 :(得分:1)

A) 在初始化程序中执行此操作是个坏主意(例如,initWithNibName:bundle :)

self.arrayData = [NSArray arrayWithObjects:@"Usuario:",@"Password:",nil];

改为使用:

arrayData = [[NSArray alloc] initWithObjects:@"Usuario:",@"Password:",nil];

你不应该在初始化程序或dealloc中调用这些访问器(属性)。

B)

  

是正确的,以致于

     

[self.arrayData release]

没有。在许多情况下(假设您实现了您声明的某些属性),您可能无法返回到ivar。您可能会收到副本,占位符对象或子类可能已选择重新实现访问器(作为一些示例)。在这些情况下,它很容易过度释放或过度保留(导致恶意,如泄漏和崩溃)。

这是典型的:

self.arrayData = nil;

除非你在声明ivar的对象的dealloc中:

- (void)dealloc {
  [arrayData release], arrayData = nil;
  [super dealloc];
}