Objective-C - Test für die Objekt-Instanz dealloced/befreit
Da noch einiges zu testen für eine objective-c-Instanz für dealloced/befreit (retain count == 0)??
Durch Beispiel, Ein Objekt über einen Verweis (Zeiger) auf Objekt B Objekt B kann befreit werden, im Speicher niedrigem Niveau, wie ich test-Referenz B sicher zu sein, es war dealloced??
@interface A : NSObject {
B b;
}
@implementation A {
- (void) someAction:(id) sender {
//is b previously dealloced??
if ..... ???? {
b = [[B alloc] init];
}
//continue
}
}
Dank!!
- Es klingt wie dieser Artikel zeigen Ihnen wie es geht: "Ausführen" - Code bei der Freigabe eines Objekts
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann man nicht testen, ob ein Objekt wurde dealloced denn natürlich, das Objekt ist nicht da, um sprechen zu mehr. Wenn Sie
b
auf nil, wenn Sie es loslassen (z.B. um zu tunself.b = nil
), obwohl, können Sie den test für null und erstellen Sie das Objekt dann.Wenn Sie die
NSZombieEnabled
Umgebungsvariable, dann dealloced Objekte werden zu Instanzen vonNSZombie
. Diese werfen, wenn Sie weiter benachrichtigten, so dass Ihr code zu crash-und brennen, genau das, was Sie brauchen, um zu Debuggen dieser situation.http://www.cocoadev.com/index.pl?DebuggingAutorelease
Update: Für XCode 4.0 sehen So aktivieren Sie NSZombie in Xcode?
Da die variable
b
ist komplett intern, um die KlasseA
, und ist nicht deklariert, wie@public
(die Standardeinstellung ist@protected
), der beste Weg, zu wissen, obb
wurde freigegeben ist, um Sie freizugeben, und setzen Sie den Zeiger aufnil
. So können Sie einfach überprüfenif (b == nil)
und eine neue Instanz erstellen, wenn nötig.Die größere Frage ist allerdings, was die wahre Natur-und memory-Verhalten des
b
ist. Sie sagen, dass die "Objekt B kann befreit werden, im Speicher niedrigem Niveau", aber nicht erklären, warum. Wenn Sie die standard-Redewendungen für retain-release in Objective-C, würde ich denken, dass derjenige sein würde, der, um zu bestimmen, ob B sein sollte aufgehoben werden, da es eine neue Instanz zu erstellen. Wenn Sie nicht möchten, dass für Eine solche Beschlüsse zu fassen, die es ermöglicht, weisen Sie eine neue B führt zu Eigentum Verwirrung und Speicher-bugs die Straße hinunter.Wenn A nicht in Höhe von B, und wenn Sie sind auf Leopard (oder darüber hinaus) und haben die garbage collection aktiviert, was Sie können wollen, ist ein Nullung schwache Referenz. Dieser wird deklariert, mit
__weak
vor eine Instanz, die Deklaration von Variablen, und nicht verhindert, dass der garbage collector das Objekt, das es Punkte zu. (Eine "starke" Referenz ist der Standard, und der garbage collector wird nicht freigegeben Gegenstand, den er verfolgen kann, von einer Wurzel, die sich nur über starke Referenzen.) Weitere, die GC wird automatisch eingestellt, schwache Referenzen zu 0 für Sie, wenn/wenn das Objekt freigegeben wird.Kommen wir zurück zu "die größere Frage", es sei denn
b
ist schon eine schwache Referenz und GC ist auf, (und noch ein paar andere Bedingungen halten), das system wird nicht automatisch freigeben B für Sie. Wenn der Grund für die Freilassungb
ist, dass Instanzen von B über die Zeit wachsen, (wie ein cache der Gegenstände entbehrlich), es wäre viel besser, einen Weg zu haben, leer B. Zum Beispiel, veränderlich Sammlungen in der Stiftung haben eine-removeAllObjects
Methode. Ein solcher Ansatz würde verhindern, die meisten der Verwirrung darüber, obb
noch existiert, und ist viel effizienter als immer wieder (de)zuordnen von Objekten.Wenn Sie behalten b funktioniert, wird es nicht freigegeben ist, in Bedingungen von wenig Arbeitsspeicher.
Ist, es sei denn, Sie werden freigeben, es selbst, in dem Fall ist es wichtig, dass Sie manuell entfernen Sie alle Verweise auf Sie, bevor Sie das tun (durch das ersetzen Sie mit null -)
In diesem Fall einfach testen es für den null-Wert übernehmen:
Wenn es scheint, wie Ihre Objekte werden automatisch freigegeben, dann müssen Sie überprüfen Sie Ihren code, um zu überprüfen, die Sie beauftragt haben, ist es ausreichend.
Könnten Sie versuchen, indem NSLog-Nachrichten, die in den Objekten
dealloc
Methode. Das zumindest sagen Sie, wenn das Objekt freigegeben wird.wäre ein "try-catch" zu arbeiten?