2012-07-27 28 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];