我还在学习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;
}
正如评论所要求的那样,会泄漏内存吗?或者这是用新对象替换上一个对象的有效方法吗?
谢谢你,
弗兰克
答案 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,无论是显式还是通过'。'语法,将做正确的事情 - 包括正确的内存管理。
所以简而言之:不,这不会泄漏记忆。