2010-12-02 83 views
0

我有一個控制器類X有IBAction實例方法說dosomething。分配和釋放一個類

我有其他類Y做了一些計算,並委託自己。

在這個方法中,可以創建一個類Y的實例。現在應該在哪裏發佈Y的實例。@property是唯一的解決方案。

//這個動作在類X

- (IBAction爲)DoSomething的:(ID)發送方 {

Y * Y = [[Y的alloc] INIT];

// init方法在Y中實現,執行一些工作以及它的代表時常被調用。如果我們釋放y,則爲 。這將是一場崩潰。那麼發佈y的地方在哪裏。 @property是創建一次性內存並使用它的解決方案。 有沒有什麼辦法可以在這裏發佈,只有當下一次創建其他對象的時候,只有當代表完成一段時間後他們的工作纔會被銷燬//

// [y release];它的崩潰。

}

+1

你好。只有幾個語義問題:一個類只被分配一次,並且它永遠不會「釋放」或以其他方式解除分配,直到Objective-C運行時被取出內存AFAIK。所以,你真正想知道的是**對象的分配和釋放**,而不是**類**。在其他語言中(尤其是那些將類建模爲原型的語言),這種區別並不重要,但在Objective-C中,它非常重要:類也是一個對象,它管理着對象的特徵。 – 2010-12-02 15:43:08

+0

嗨喬納森謝謝。我幾乎沒有懷疑是不是必須的如果類創建了這樣一種方式它有它的對象,並且類說Y本身是其他類的對象,現在有必要釋放類Y.當多個對象在X中被創建和銷燬。 – ashish 2010-12-03 09:24:22

回答

0

你可以做一兩件事,

// In the .h file 
// declare like this. 
Y *y; 

// In the .m file 

-(IBAction)dosomething:(id)sender { 

    if(y== nil) 
     y = [[Y alloc]init]; 

} 

,並在dealloc方法,可以釋放

- (void)dealloc{ 
    [y release]; 
    [super dealloc]; 
} 
+0

如果有幾次這個方法被調用 - (IBAction)dosomething:(id)發送者一次。那麼在那個時候y不會是零,所以並不是因爲那種方法上的少量命中而沒有同時創建新的實例。 – ashish 2010-12-02 12:27:18

0

它似乎對我來說,最簡單的方法來解決問題是在Y dealloc中調用Y.delegate = nil,並在調用任何Y.delegate方法之前檢查Y.delegate == nil

0

你說一些工作是在Y類的init方法中完成的。在某些代表需要Y的對象直到工作完成之前。之後,你想釋放Y.

因此,在該代表中有一個Y屬性並使其保留。釋放它,並在你的工作完成後將它設置爲零。

所以在X的dosomething()方法中,您可以立即釋放Y的實例。 請記住這條規則,當X需要Y直到它的工作完成時才活着,它只需要擁有所有權。

這正是爲什麼保留計數在Obj C中維護的原因。這樣一個對象可以擁有多個所有者。當它的所有者釋放對象時,只有它從內存中移除。