können wir außer Kraft setzen alloc und dealloc in objective C?
Ich weiß, dass dies nur selten erforderlich ist, um das überschreiben der alloc
oder dealloc
Methoden,aber wenn erforderlich ist es möglich in der iPhone-Programmierung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie und in der Tat, sollten Sie (wenn manuelle Speicherverwaltung) überschreiben
dealloc
um alle Ressourcen, die Sie halten (nicht vergessen, zu nennen[super dealloc]
wenn Sie fertig sind). Überschreibenalloc
ist möglich, aber, wie du sagst, nur selten erforderlich.NSObject
überschreiben solltenallocWithZone:
eher alsalloc
, und kann nicht außer Kraft gesetztdealloc
im code, zusammengestellt, die sich mit BOGEN.[super dealloc]
". Es ist immer noch möglich, dealloc überschreiben, aber nur selten nützlich.dealloc
ist immer noch eine gute Praxis, wenn Sie benötigen, um die Registrierung von Benachrichtigungen oder entfernen gesture recognizers, wenn die Instanz wird aufgehoben.[super dealloc]
oder, noch wichtiger, Sie müssen nicht, wie ARC ist "alle über Sie" in Ihrem Namen.Allgemein, überschreiben
alloc
wird nur dann gemacht, wenn Sie möchten, zB, reservieren Sie ein Objekt aus einem pool der verfügbaren Instanzen, oder vielleicht eine variable zuordnen, die Menge an Speicher für das Objekt, basierend auf einigen externen parameter. (In C++ können Sie den Zugriff auf dienew
Parameter und zuweisen, die auf diesen basieren, aber Objective-C nicht geben Ihnen Zugang zu deninitXXX
Parameter.)Ich habe nie versucht, irgendwelche von diesem, und ich vermute, dass es ein bisschen von einem Minenfeld-Sie brauchen, um zu studieren bis auf die Strukturen und ziemlich vorsichtig.
Als Adam sagte, Sie sollten IMMER (in einer Referenz-gezählt Umgebung) überschreiben
dealloc
wenn es irgendwelche beibehalten Objekte gehalten, die von Ihrem Objekt.Update: Eine interessante Sache, die Sie tun können, ... in RedClass oder einer übergeordneten it-code so etwas wie:
Das Ergebnis ist, dass, wenn Sie ausführen
[RedClass alloc]
eine BlueCLass-Objekt zurückgegeben werden. (NB: Vermutlich BlueClass ist eine Unterklasse von RedClass, oder es wird ernsthaft gemuckt bis kurz nach der Objekt zurückgegeben.)Nicht sagen, dass es eine gute Idee, dies zu tun, aber es ist möglich (und ich nicht ohne weiteres wissen von Fällen, wo es nicht funktionieren würde zuverlässig für Vanille Benutzer-definierte Klassen). Und es gibt ein paar mögliche verwendet.
Zusätzlicher Hinweis: In einigen Fällen verwenden möchten
[self isSubclassOf:[RedClass class]]
eher als==
(obwohl, der hat einige ernsthafte Gefahren).alloc
, aber es keine Parameter zualloc
(andere alsself
und_cmd
), es ist also nicht klar, was Sie sich beziehen. Wenn Sie also Informationen über Instanzen, zum Beispiel Ihre Größe, die Objective-C runtime gibt Ihnen Zugriff auf alles, und alles, was eine Implementierung hätte wissen müssen.new
Parameter.NSNumber
haben einen pool von Instanzen, für gemeinsame Werte? Ich verstehe, wie[NSNumber numberWithInt:1]
etc würde funktionieren, da bekommen wir die param bevor wir alloc, aber Woher weiß er, die Rückkehr der gleichen Instanz mit[[NSNumber alloc] initWithInt:1]
? Selbst mit getaggten Zeiger oder alle anderen fancy stuff Sie tun, hinter den kulissen, du bist immer noch der Aufruf von alloc zunächst ohne jede Kenntnis von dem gespeicherten Wert. Das einzige was ich mir vorstellen kann ist, dass der Aufruf[NSNumber alloc]
gibt einen einzigen gemeinsamen Instanz und dann-[NSNumber initWith...]
gibt die spezifische. Ja?[NSNumber alloc]
gibt eine gemeinsame Instanz desNSPlaceholderNumber
.+[NSNumber numberWithInt:100]
gibt eine tagged pointer, also ist es das gleiche, egal wie viele Male Sie es nennen.-[NSNumber initWithInt:100]
wieder die gleichen tagged-Zeiger.self
zurückgegebene Wert von der super sinit
routine, vs den Wert es empfängt den Anruf.alloc
routine, es ist nur selten explizit verwendet. Allerdings vergesse ich die syntax.malloc(sizeof(TheClass))
(odernew
mit einemchar
array, dann wirft), aber es ist einfach nicht getan. Wenn es eine spezielle syntax, die würde es auch erlauben, die Zuweisung ohne Initialisierung auf den Stapel anstelle von heap, würde ich es begrüßen, wenn Sie möchten, posten Sie es, wenn Sie sich daran erinnern.new
Methode in Ihrer Klasse. Die ersten parm ist die Größe zugeteilt werden, und Sie können Optional auch Spiegel der Konstruktor parms als zusätzliche parms zunew
. (Aber ich bin an dieses ab etwa 12 Jahre zurück, so ist es ein wenig unscharf.)new
Betreiber?! Das ist böse. o_o Es auch immer noch erfordert einemalloc()
im inneren, und es immer noch ruft den Konstruktor. Zumindest von dem, was ich erzählen kann. cprogramming.com/tutorial/operator_new.html Sieht aus wie das aufrufen nuroperator new
wird unterstützt, wenn: stackoverflow.com/questions/2382930/...alloc
. Ich benutzte es, um gute Wirkung bei der Gestaltung einer Reihe von sparse-Vektor-Klassen für Daten-flow-Analyse.