2012-07-27 30 views
3

可以说我有这样的成员:@synthesize内存managemnet

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

现在,让我们在一些其他类的说,我设置的学生,意味着我的一些分配给新创建对象的学生。现在假设学生之前已经参考了一个对象,所以我的问题是当我向学生分配新的对象ref时这个对象是否被释放?在此代码

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

那么我有分配新的前显式释放旧对象或不@synthesize确实在后面?我希望你明白我想说什么。

注意:不使用ARC。

谢谢。

+0

我已经回答您可以检查并相应回复。我也有你的问题:) – 2012-07-27 09:36:06

回答

3

合成的setter将release任何先前保留的对象,然后保留新的;是这样的:

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

注意,它retain S中传入的对象以前release -ing旧的对象;这使您可以将相同的对象传递到本身而不会释放它。

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

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

释放学生对象的正确方法是设置nildealloc方法:

- (void)dealloc 
{ 
    [self setStudent:nil]; // or self.student = nil; 
    [super dealloc]; 
} 
+0

所以合成器的方法释放它,我不需要打扰那么多的权利? – 2012-07-27 09:39:02

+0

@bloodwing不是 - 这一切都照顾。 – trojanfoe 2012-07-27 09:40:58

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];