2011-08-04 147 views
0

我有一個UIViewController(稱爲它)與我已經保留和合成的NSDate實例。保留來自另一個對象的保留變量?

在另一種方法,我創建另一個UIViewController中(稱爲B),並希望通過它的NSDate實例。在B中,我將要使用它。我是否也應該保留並綜合這個實例?我假設B將使用A創建的同一個NSDate實例,並且如果內存不足,可能會在viewDidUnload中刪除A的實例。

在另一方面,如果我保留和合成它,我要釋放它當B的看法已經一去不復返了。當我回到A時,NSDate實例消失了。

那麼,什麼是最好的做法嗎?我應該在B中創建一個新的NSDate對象,並使其與傳入的日期相同?並保留/綜合這個新的實例?

回答

0

我可能誤解了你的問題,但它聽起來並不像你的引用計數的目的C.如何工作的一個非常好的主意(我的意思不是通過任何罪行;它可以是棘手的)如果你正確地管理你的內存,當B的視圖消失時,你的NSDate實例將不會被釋放。你的設置應該是這樣的。現在

// A.h 
@property(nonatomic, retain) NSDate *myDate; 
@synthesize myDate; 

// A.m 
- (id) init 
{ 
    if (self = [super init]) 
    { 
     // Setter retains the new NSDate instance; its reference count is now 1 
     // (after autorelease) 
     [self setMyDate:[NSDate date]]; 
    } 

return self; 
} 

- (void) someMethod 
{ 
    // Assume b is a pointer to your B instance. B's setter retains the NSDate 
    // again; it's reference count is now 2 
    [b setMyDate: myDate]; 
} 

- (void) dealloc 
{ 
    [myDate release]; 
} 

// B.h 
@property(nonatomic, retain) NSDate *myDate; 
@synthesize myDate; 

// B.m 
- (void) dealloc 
{ 
    // Assuming B is deallocated first, the NSDate's reference count will 
    // now be 1. It will still be accessible to the A. 
    [myDate release]; 
} 

,當你B實例被釋放,你NSDate實例將釋放。被釋放與被釋放不同。釋放的對象仍然具有1的引用計數,因爲它最初由A實例保留。 NSDate實例將不會被釋放,直到A實例釋放實例並且其引用計數降爲零。希望有所幫助。對目標C內存管理

更多信息,請here。另見this question

+0

但是在B的viewDidUnload中,NSDate實例被設置爲nil。 A仍然保留它不是一個問題嗎?或者我不應該在viewDidUnload中將其設置爲零? –

+0

'A'和'B'分別維護指向'NSDate'實例的指針。當調用B的'viewDidUnload'時,你將它的_pointer_設置爲'NSDate'實例爲'nil'。實例本身仍然存在於內存中,仍然可以通過'A'訪問。它**是一個問題,如果你沒有先釋放它,將指針設置爲'NSDate'爲'nil'。這將導致內存泄漏,因爲'NSDate'的保留計數將不會正確遞減,因此永遠不會被釋放。 –

+0

關於你是否應該釋放''viewDidUnload'中的'NSDate',否則我認爲這可能是不值得的。由於它仍然由'A'保留,所以如果當'B'的'viewDidUnload'被調用時''A實例仍然存在,它將不會被釋放。因此,你並沒有通過在該方法中釋放它來完成任何事情。 –

0

我完全明白你想要什麼。我建議你爲NSDate設置房產。

//.h

NSDate *date; 

@property(nonatomic,retain) NSDate *date; 

//.m 

@synthesize date; 

而且使用日期視圖 - 控制。 現在您最初執行日期的操作不應該在viewDidLoad中,它們應該在viewWillAppear之內。這將有助於你得到的日期值,當你從一個作爲viewWillAppear總是叫回來。