Ich würde gerne wissen, wie oft ein Objekt automatisch freigegeben wurde. Ich habe lange genug mit Objective C gearbeitet, dass es im Allgemeinen einfach ist, zu wissen, ob ein Objekt automatisch freigegeben wurde oder nicht, aber ich sehe immer wieder Fragen, die sich mit Speicher und RetainCount beschäftigen. Irgendwann kommt immer die Antwort: "Man kann dem retainCount eines Objekts nicht trauen" - womit ich einverstanden bin, ABER wenn man feststellen könnte, wie oft ein Objekt automatisch freigegeben wurde, dann könnte man tatsächlich vertrauen können der retainCount, wenn Sie eine Kategorie hinzugefügt haben wie:
@interface NSObject (NSObject_MemoryDebugging)
- (NSUInteger) autoReleaseCount;
- (NSUInteger) retainCountWithAutoRelease;
@end
@implementation]
/** Determine how many times this object has been marked for autorelease **/
- (NSUInteger) autoReleaseCount;
{
// ??? not sure how to figure this out.
return 0;
}
- (NSUInteger) retainCountWithAutoRelease
{
NSUInteger retainCount = [self retainCount];
NSUInteger autoReleaseCount = [self getAutoReleaseCount]; // ???
return retainCount - autoReleaseCount;
}
@end
Es würde immer noch eine Ausnahme für unveränderliche Typen sein, da diese typischerweise die Retain-Zahl während einer Kopie erhöhen, so dass Sie immer noch nicht retainCount auf diese vertrauen können.
Was ich NICHT vorschlage
Ich bin nicht auf der Suche nach dieser Antwort, um retainCount im Produktionscode zu verwenden. Allerdings kann ich sehen, dies als wertvoll für jemanden zu debuggen Speicher Probleme.
Ich kann mir vorstellen, dass einige Leute diese Frage hassen werden, da Programmierer sich nicht darum kümmern sollten, wie oft ein Objekt automatisch freigegeben wurde. Beim Kodieren sollte es darum gehen, Alloks, Retain, Copy, New mit Release auszubalancieren, Ende der Geschichte. Wie auch immer, der Sinn dieser Frage ist es, den Leuten zu helfen, die sich den Kopf zerbrechen. [NSObject retainCount]
verbrennt eine Menge Leute, und eine Antwort auf diese Frage wäre ziemlich cool.
Ich bin sicher, dass es einen Weg gibt, um festzustellen, wie oft ein Objekt automatisch freigegeben wurde. Ich weiß nur nicht, was es ist, daher die Frage.
Siehe ähnliche Frage: Objekte innerhalb von NSAutoreleasePool in objective-c .
bearbeiten
Ich danke Ihnen allen für Ihre Antworten. Vielleicht ist das für Sie interessant => Ariel hat darauf hingewiesen, dass die GNUStep-Implementierung von Cocoa und insbesondere der NSAutoReleasePool diese Methode hat: +(NSUInteger)autoreleaseCountForObject:(id)anObject . Diese Methode ist langsam und gibt nur die Anzahl der automatischen Freigaben von NSAutoReleasePools im Thread des Aufrufers zurück. Trotzdem... Es ist interessant, dass sie vorhanden ist. Die Docs zitieren, dass es wirklich nur für die Fehlersuche nützlich ist. Dies ist wirklich, was ich hoffte, zu finden (oder finden möglich) in der Cocoa-Framework irgendwie.
Ich stimme mit den gegebenen Antworten überein, dass, selbst wenn es möglich wäre, die Anzahl der Autoreleases zu erhalten, bessere Werkzeuge existieren (Zombies, Leaks, statische Analysatoren).