Objective-C 2.0;分配财产;泄漏记忆?

时间:2009-05-03 22:21:18

标签: objective-c iphone memory-management

我还在学习Objective-C内存管理。我正在尝试在我正在构建的示例程序中实现几个简单的类。

举个例子,假设我有以下类定义:

 #import <UIKit/UIKit.h>

 @interface customViewController : UIViewController 
 {
    customObject *myCustomObject;
 }

 @property (retain) customObject *myCustomObject;

 - (void)replaceCustomObject:(customObject *)newObject;

 @end

对于属性,我使用标准的synthesize关键字......

@synthesize myCustomObject;

然后请假设在customViewController的实例中,myCustomObject已经设置了有效值并且正在使用中。然后方法replaceCustomObject定义为:

 - (void)replaceCustomObject:(customObject *)newObject
 {
     //Does this cause a memory leak because I just assign over
     //the existing property? 
     self.myCustomObject = newObject;
 }

正如评论所要求的那样,会泄漏内存吗?或者这是用新对象替换上一个对象的有效方法吗?

谢谢你,
弗兰克

4 个答案:

答案 0 :(得分:3)

正如其他人所提到的,您的代码完全有效,并且在分配给属性时不会泄漏内存。

如果您忘记实施正确的dealloc方法,则在销毁customViewController时,最后分配的对象将会泄露。正确的dealloc实现看起来像这样:

- (void)dealloc
{
    self.myCustomObject = nil;
    [super dealloc];
}

答案 1 :(得分:2)

这完全有效,并且不会泄漏内存。合成的访问器正确管理保留计数。

(顺便说一下,你不需要replaceCustomObject:方法;因为你的属性默认是readwrite,你有一个自动生成的setCustomObject:方法,你的类的客户端可以使用,并遵循正常的Cocoa命名约定。)

答案 2 :(得分:2)

根据this,如果您在声明中使用(保留),则合成方法将首先释放旧值,然后保留新值:

if (property != newValue) {
    [property release];
    property = [newValue retain];
}

答案 3 :(得分:1)

属性访问器语法

self.x = y;

与显式调用setter方法具有相同的效果:

[self setX:y];

访问器方法将执行任何已编写的操作。在您的情况下,对于已经@synthesized的@property(retain)属性,访问者将释放旧对象并保留新对象。

所以,调用setter,无论是显式还是通过'。'语法,将做正确的事情 - 包括正确的内存管理。

所以简而言之:不,这不会泄漏记忆。