3

假设我有这个成员:

@property (retain, nonatomic) Student *student;
@synthesize student;

现在让我们在其他班级说,我正在设置学生,这意味着我正在将一些新创建的对象分配给学生。现在假设 student 之前已经引用了一个对象,所以我的问题是当我将新对象 ref 分配给 student 时,这个对象是否被释放?在这段代码中

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

那么我必须在分配新对象之前明确释放旧对象还是@synthesize 在后面这样做?我希望你明白我想说什么。

注意:不使用 ARC。

谢谢。

4

2 回答 2

3

合成的 setter 将release在保留新对象之前将任何先前保留的对象;就像是:

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

请注意,它是旧对象之前retain传入的对象;这允许您将相同的对象传递给自身而无需释放它。 release

还有其他方法可以做到这一点,例如:

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

释放学生对象的正确方法是nil在您的dealloc方法中设置:

- (void)dealloc
{
    [self setStudent:nil];    // or self.student = nil;
    [super dealloc];
}
于 2012-07-27T09:05:07.943 回答
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];
于 2012-07-27T09:21:19.650 回答