2009-02-25 55 views
4

我有一個類是負責和建立我的模型對象的所有者。它爲模型分配內存並保留它們,並在發生dealloc時負責釋放它們。我是否在iPhone上發佈這個實例變量?

現在我有一個相應的UIViewController,在這種情況下充當客戶端。它將有幾個實例變量,指向它需要的模型。它不需要爲他們分配內存,因爲負責這樣做的類已經完成了它。我仍然需要從客戶端釋放內存嗎?這裏有一個例子

ModelHolder.m將有類似

- (NSArray *)modelA 
{ 
    if (modelA == nil) { 
     modelA = [[ModelClassA alloc] init]; 
    } 

    return modelA 

} 

- (void)dealloc { [super dealloc]; [modelA release]; } 

現在ClientViewController都會有類似的東西:

@class myModelA; 
@interface ClientViewController : UIViewController { 
    ModelClassA myModelA; 
} 

// more code 
@end 
#import "ModelHolder.h" 
@implementation ClientViewcontroller ...... etc 
- (void)viewDidLoad 
{ 
    self.myModelA = [instanceOfModelHolder modelA]; 
} 
- (void)dealloc { 
    // am I responsible to release here? 
} 

請不要介意任何語法錯誤,我剛纔寫的上飛在這裏。儘管如此,我認爲我的觀點在代碼中表現得很好。

謝謝。

回答

4

假設你宣佈ClientviewController的modelA財產或者@property(retain)@property(copy),或@property(mutableCopy),你保留該財產的價值,所以你必須將其釋放。

2013年編輯:假設你沒有使用ARC。 ARC會爲你做這件事,所以通常根本不需要在ARC下實現dealloc。當不使用ARC時,你需要釋放你擁有的所有東西。

0

你應該把[super dealloc];最後在自己的dealloc。

- (void)dealloc 
{ 
    [modelA release]; 
    [super dealloc]; 
} 

至於你提到,在過去的dealloc釋放的問題這取決於你如何指定@property myModelA,它是一個「保留」或「複製」屬性,你應該做的釋放。它是一個「副本」,你實際上負責一個新對象。

+0

權,正如我所說,不介意任何缺失。就內存管理而言,原始問題仍然存在。 – Coocoo4Cocoa 2009-02-25 18:48:37

+0

剛纔輸入了它...... :) – epatel 2009-02-25 18:50:06

0

你應該已經做了這個謊言

- (void)viewDidLoad 
{ 
    ModelClassA *myModelA = [instanceOfModelHolder modelA]; 
    self.myModelA = myModelA; 
    [myModelA release]; 
} 

由於釋放任何別的地方可能會導致內存泄漏,有時甚至導致應用程序崩潰,如果引用計數沒有適當的照顧。

也請注意,你還沒有做出ModelClassA myModelA;屬性,所以你應該避免釋放它的dealloc中,直到你確信它已經引用計數大於1

相關問題