2012-04-12 5 views
0

Es gibt zweifellos eine Fülle von Informationen zur Speicherverwaltung in iOS. Nachdem ich eine ganze Menge darüber gelesen habe, ist mir immer noch unklar, was "BEST" für bestimmte Situationen bedeutet. Bitte kann ich eine Klärung der Frage auf zwei Beispiele unten ...Eine andere Speicherverwaltung Abfrage für Ivars

Ich habe eine NSMutableArray, die für eine Tableview und einem UIBarButtonItem als Datenquelle fungiert genannt editButton beide wie folgt deklariert:

@interface MyTableViewController : UITableViewController { 

    NSMutableArray *datasourceArray; 
    UIBarButtonItem *editButton; 

} 

@property (nonatomic, retain) NSMutableArray *datasourceArray; 
@property (nonatomic, retain) UIBarButtonItem *editButton; 

@end 

Ich habe dann synthetisiert sie und alloc'd/init'd sie wie folgt:

@implementation 

@syntesize datasourceArray, editButton; 

-(void)viewDidLoad { 

self.datasourceArray = [self retrieveDatasourceArray]; 

self.editButton = [[UIBarButtonItem alloc] initWithTitle:@"Edit" style:UIBarButtonItemStylePlain target:self action:@selector(editTable)]; 
[self.navigationItem setRightBarButtonItems:[NSArray arrayWithObjects:editButton, nil] animated:NO]; 
[editButton release]; 

} 

-(void)retrieveDatasourceArray { 

NSMutableArray *datasource = [[[NSMutableArray alloc] initWithObjects @"example1", @"example2", nil] autorelease]; 

return datasource; 

} 

-(void)dealloc { 

[datasourceArray release]; 
[editButton release]; 
[super dealloc]; 

} 

Frage 1: Die NSMutableArray

Wie Sie sehen können, habe ich die eigentliche Erstellung des Arrays in eine andere Methode getrennt, da es viel Code gibt, der aus Core-Daten abruft und sortiert (was für diese Frage nicht benötigt wird), die ich trennen wollte. Ich habe daher beschlossen, ein NSMutableArray zurückzugeben, das automatisch freigegeben wurde, und dies auf das self.datasourceArray zu setzen, das in der Header-Datei definiert ist. Ist das eine sinnvolle und leckfreie Umsetzung?

Frage 2: Die Schaltfläche Bearbeiten

Wie ich später den Titel und den Stil der editButton ändern müssen, muss ich den Zugriff darauf haben, daher ist es zu erklären. Ich weise es dann in der viewDidLoad-Methode zu/init an und füge es zu einem Array hinzu (mit einigen anderen Buttons, die hier nicht gezeigt werden), bevor ich dieses Array benutze, um die Buttons zur navigationBar hinzuzufügen. Ich habe dann das editButton freigegeben, wie ich es zugewiesen habe und es einem Array übergeben. Ist das bei meiner Dealloc-Methode notwendig oder notwendig oder sogar an der richtigen Stelle?

Vielen Dank im Voraus

EDIT: Weitere Frage 3:

Wenn eine dieser ivars an anderer Stelle in meinem Code Zugriff (zB beim Aufruf von [datasourceArray count] oder den Titel der ‚Edit Zurücksetzen "Taste 'Fertig', sollte ich selbst verwenden Notation oder nicht

EDIT:.? Weitere Frage 4:

Else wo ich den folgenden Code verwendet habe, um ein synthetisiertes NSMutableArray zu initialisieren. Angesichts der folgenden Antworten, ist das mehr undicht ...?

[self setDatasourceArray: [[NSMutableArray arrayWithArray: [self retrieveDatasourceArray]]; 

Antwort

1

ersten Punkt für die Array-

NSMutableArray *datasource = [[[NSMutableArray alloc] initWithObjects @"example1", @"example2", nil] autorelease]; 

return datasource; 

hier Sie es richtig ..returning ein Autoreleased tun object..which durch die Variable beibehalten werden, weil Sie es definiert vom Typ behalten (wenn Sie @property getan haben).

zweiten Punkt für die Edit-Taste

self.editButton = [[UIBarButtonItem alloc] initWithTitle:@"Edit" style:UIBarButtonItemStylePlain target:self action:@selector(editTable)]; 

[self.navigationItem setRightBarButtonItems:[NSArray arrayWithObjects:editButton, nil] animated:NO]; 

[editButton release]; 

Hier sind Sie offenbar über das Objekt Freigabe .. die Variable erinnern behält die neue Variable, die Sie bearbeiten Taste defined..so die neue Bar behält Button item..so loslassen. notwendig ist, was man tun in time..which Sie dealloc..but hier auch die Freigabe führt zu overrelease..to zu lösen dies nur die Freigabe Linie entfernen und den Code aktualisieren wie diese

self.editButton = [[[UIBarButtonItem alloc] initWithTitle:@"Edit" style:UIBarButtonItemStylePlain target:self action:@selector(editTable)]autorelease]; 
[self.navigationItem setRightBarButtonItems:[NSArray arrayWithObjects:editButton, nil] animated:NO]; 

Hier gelangen Sie zu sein, dass Die neue Instanz, die erstellt wird, wird automatisch freigegeben .. und ihr Wert wird von Ihrer Variablen

+0

ausgezeichnet erhalten Dank - sehr geschätzt. Könnte ich Sie vielleicht dazu bringen, sich die Frage 3 anzusehen, die ich gerade hinzugefügt habe? Der Grund, warum ich es wegen der Frage hinzugefügt habe: http://stackoverflow.com/questions/4080523/when-should-i-use-the-self-keyword, in dem jemand sagt, dass Sie init verwenden sollten, wenn Sie self verwenden. Notation. Irgendwelche Gedanken? –

+0

Typo ... Sollte * NOT * Einheit benutzen ... Verzeihen Sie mir! –

+0

self.iVarName sollte verwendet werden, wenn Sie die Variable @property definiert haben und init und autorelease einfach die Alternative sind, init nicht zu verwenden ... wenn Sie init..that abject nicht automatisch ... verwenden und ... Wenn Sie init verwenden .. sollten Sie auch autoRelease verwenden, so dass es wieder autorealease Objekt wird. – Shubhank

Verwandte Themen