2009-02-25 6 views
4

Ich habe eine Klasse, die verantwortlich ist und der Besitzer meiner Modellobjekte. Es weist Speicher für die Modelle zu und lässt sie beibehalten und ist verantwortlich für die Freigabe, wenn das Dealloc passiert.Gibt ich diese Instanzvariable auf dem iPhone frei?

Jetzt habe ich einen entsprechenden UIViewController, der in diesem Fall als Client fungiert. Es wird mehrere Instanzvariablen haben, die auf die benötigten Modelle zeigen. Es muss den Speicher nicht für sie reservieren, da die dafür verantwortliche Klasse es bereits getan hat. Muss ich den Speicher noch vom Client freigeben? Hier ist ein Beispiel

ModelHolder.m haben so etwas wie

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

    return modelA 

} 

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

Nun ist die ClientViewController etwas ähnliches haben:

@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? 
} 

Bitte nichts dagegen keine syntaktische Fehler, wie ich dies nur auf schrieb die Fliege hier. Ich denke, mein Punkt wurde im Code gut dargestellt.

Danke ..

Antwort

4

Unter der Annahme, dass Sie ClientviewController der modelA Eigenschaft entweder als @property(retain), @property(copy) erklärt oder @property(mutableCopy), Sie behalten den Wert dieser Eigenschaft, so dass Sie es freigeben müssen.

EDIT aus dem Jahr 2013: Angenommen, Sie verwenden nicht ARC. ARC wird das für Sie tun, also gibt es normalerweise keine Notwendigkeit, dealloc überhaupt unter ARC zu implementieren. Wenn Sie ARC nicht verwenden, müssen Sie alles freigeben, was Ihnen gehört.

0

Sie [super dealloc]; zuletzt im eigenen dealloc setzen sollte.

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

Was Ihre Frage in der letzten dealloc über die Freigabe es hängt davon ab, wie Sie die @property myModelA angegeben, ist es eine „behalten“ oder eine „Kopie“ Eigenschaft sollten Sie Release tun. Ist es eine "Kopie", sind Sie tatsächlich für ein neues Objekt verantwortlich.

+0

Rechts zählen hat, wie ich, erwähnt nichts ausmacht alles fehlt. Die ursprüngliche Frage steht immer noch so weit wie die Speicherverwaltung geht. – Coocoo4Cocoa

+0

War es gerade jetzt tippen ... :) – epatel

0

Sie sollten es dieses

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

getan liegen Wie loslassen wo sonst zu Speicherlecks führen kann oder manchmal sogar die Anwendung abstürzen, wenn der Referenzzähler nicht richtig gepflegt werden.

Bitte beachten Sie auch, dass Sie nicht ModelClassA myModelA; eine Eigenschaft gemacht haben, so dass Sie es in der dealloc loslassen sollten es vermeiden, bis Sie sicher sind, dass sie Bezug größer als 1

+0

'[instanceOfModelHolder modelA]' sollte nicht eine Referenz, die Sie besitzen, zurückgegeben haben, so dass 'myModelA' nach der Zuweisung falsch ist. Die ursprüngliche Implementierung dieser Methode des Fragestellers ist richtig. 'self.myModelA = ...' wird nur funktionieren, wenn es sich um eine Art von Eigenschaft handelt, entweder informell oder formal, und in jedem Fall sollte der Setter dieser Eigenschaft es beibehalten; Wenn dies der Fall ist, sollte 'dealloc' es sicherlich freigeben. Ob "es eine Referenzzahl größer als 1" hat, geht Sie nichts an; Wenn * Sie * es besitzen, dann sollten Sie * es * loslassen, unabhängig von irgendetwas anderem im Programm. –