iOS:属性 - 分配和释放对象

时间:2011-06-09 14:16:13

标签: objective-c ios memory-management memory-leaks properties

我在iOS(4)中苦苦挣扎,在一个范围内分配对象并在另一个范围内释放它。我使用属性作为对象的指针。在一个实例类方法中分配和初始化对象,然后在类的dealloc方法中释放它。使用retain声明属性。除了使用像这样的属性的问题,我还发现分配和初始化对象并设置属性很麻烦。

NSObject *object = [[NSObject alloc] init];
Self.myProperty = object;
[object release];

我试过

self.myObject = [[NSObject alloc] init];

然而,这给了我内存泄漏。

我的问题:我是否必须制作此临时对象,或者是否有更优雅的方式来执行此操作?

后续问题:我是否必须将属性设置为nil并释放自动生成的ivar?

[self setMyProperty:nil], [myProperty release];

当XCode 4为你生成属性存根时,它会在viewDidUnload中放置[self setMyProperty:nil],在dealloc中放置[_myProperty release]。

2 个答案:

答案 0 :(得分:2)

第一个问题:

autorelease是你的朋友:

self.myObject = [[[NSObject alloc] init] autorelease];

第二个问题:

不,这是多余的,但无害,因为第二次操作无效([nil release]是安全的)。 我建议使用self.XXX = nil;构造,因为它更安全,更清晰/可读。

答案 1 :(得分:1)

自我。符号正在运行合成的setter,它执行retain,这就是你需要在init对象上进行自动释放的原因。相反,你可以放弃自我。并且只需使用

myObject = [[NSObject alloc] init;

这一行只是将myObject指针设置为保留对象,你就不会有任何泄漏。

以前我的问题与你的问题一样:

MKReverseGeocoder autorelease/release question in Apple's CurrentAddress sample