@synthesize内存管理

3
假设我有这个成员:
@property (retain, nonatomic) Student *student;
@synthesize student;

现在假设在另一个类中,我正在设置学生,也就是说我正在将一些新创建的对象分配给学生。现在假设学生之前已经有了对另一个对象的引用,那么我的问题是当我将新的对象引用分配给学生时,这个对象是否会被释放?在这段代码中:

someClassObjectRef.student = newStudent; //someClassObjectRef.student is already having one student object ref

我需要在对新对象进行赋值之前明确释放旧对象吗?还是 @synthesize 会在后台处理这个问题?我希望你能理解我的意思。
注意:没有使用 ARC。
谢谢。

我已经回答了你的问题,请查看并相应地回复。我还点赞了你的问题 :) - Amir iDev
2个回答

3

合成的setter方法会在保留新对象之前释放先前保留的对象;类似于:

- (void)setStudent:(Student *)student
{
    [student retain];
    [_student release];
    _student = student;
}

请注意,在释放旧对象之前,它会保留传入的对象;这使您可以将同一对象传递给自身,而无需对其进行释放。
还有其他方法可以实现此功能,例如:
- (void)setStudent:(Student *)student
{
    if (student != _student)
    {
        [_student release];
       _student = [student retain];
    }
}

释放学生对象的正确方法是在您的 dealloc 方法中设置 nil
- (void)dealloc
{
    [self setStudent:nil];    // or self.student = nil;
    [super dealloc];
}

所以合成器方法会释放它,我不需要太过烦恼,对吧? - padam thapa
@bloodwing 不用了 - 一切都已经处理好了。 - trojanfoe

1

我希望你想要在 - (void)dealloc 或者 `- (void)viewDidUnload` 上进行内存管理。

- (void)dealloc {
   [student release]; or  [self setStudent:nil];
    [super dealloc];
 }

以下是内存管理的最佳实践,您可以在使用时创建对象并在使用后释放。

Student *student = [[Student alloc]init];
// Do Some Work over here
[student release];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接