2009-04-29 8 views
1

Ich entwickle eine Cocoa-App, und bei der Ausführung meiner App in Xcode bekomme ich manchmal die folgenden Arten von Nachrichten in der Debug-Konsole:Cocoa-Entwicklung: malloc: free_garbage: Müll ptr = 0x18a15e0, hat nicht-null refcount = 1 Fehler

< Meine App-Name > (952,0xb0103000) malloc: free_garbage: Müll ptr = 0x107b2f0, hat nicht Null refcount = 1

ich schaltete MallocStackLogging und NSZombieEnabled und tat ein malloc_history auf ein paar dieser Adressen und erhielt Spuren in Anlehnung an das Zitat von th e unten.

Der allgemeine Thread scheint in allen Blöcken mit dem Fehler Verweise auf NSPopupButtonCell zu sein.

Meine Vermutung ist, dass es etwas zu tun ist CFRetained irgendwo aber nicht freigegeben oder Müll sammelbar gemacht.

A) Ist dies eher ein Programmierfehler von mir oder etwas in dem Framework, das noch nicht richtig für den GC aktualisiert wurde?

B) Was sind die Konsequenzen des Problems, das diese Nachricht provoziert, wenn überhaupt? Muss ich auf diese Nachricht achten oder kann ich sie einfach ignorieren?

Anruf [2] [arg = 48]: thread_a003d720 | start | Haupt | NSApplicationMain | - [NSApplication run] | - [NSApplication nextEventMatchingMask: bisDatum: inMode: aus der Warteschlange:] | _DPSNextEvent | BlockUntilNextEventMatchingListInMode | ReceiveNextEventCommon | RunCurrentEventLoopInMode | CFRunLoopRunInMode | CFRunLoopRunSpecific | __CFRunLoopDoObserver | _handleWindowNeedsDisplay | - [NSWindow displayIfNeeded] | - [NSView displayIfNeeded] | - [NSView _displayRectIgnoringOpacity: isVisibleRect: rectIsVisibleRectForView:] | - [NSThemeFrame _recursiveDisplayRectIfNeededIgnoringOpacity: isVisibleRect: rectIsVisibleRectForView: topView:] | - [NSView _recursiveDisplayRectIfNeededIgnoringOpacity: isVisibleRect: rectIsVisibleRectForView: topView:] | - [NSView _recursiveDisplayRectIfNeededIgnoringOpacity: isVisibleRect: rectIsVisibleRectForView: topView:] | - [NSView _recursiveDisplayRectIfNeededIgnoringOpacity: isVisibleRect: rectIsVisibleRectForView: topView:] | - [NSView _recursiveDisplayRectIfNeededIgnoringOpacity: isVisibleRect: rectIsVisibleRectForView: topView:] | - [NSView _recursiveDisplayRectIfNeededIgnoringOpacity: isVisibleRect: rectIsVisibleRectForView: topView:] | - [NSView _recursiveDisplayAllDirtyWithLockFocus: visRect:] | - [NSView _drawRect: clip:] | - [NSControl drawRect:] | - [NSMenuItemCell drawWithFrame: inView:] | - [NSPopUpButtonCell _drawIndicatorWithFrame: inView:] | - [NSPopUpButtonCell _indicatorFrameForCellFrame: inView:] | - [NSPopUpButtonCell _indicatorFrameForCellFrame: isFlipped:] | - [NSPopUpButtonCell _defaultIndicatorImage] | - [NSPopUpButtonCell _coreUIDefaultIndicatorImage] | + [NSImage imageNamed:] | + [NSImage _coreUIImageWithName:] | + [NSImage _coreUIImageWithBaseName: state: backgroundStyle:] | - [NSCoreUIImageRep imageWithoutEffectsRect] | SizeForImageOptions | CUICopyMeasurements | CUIRenderer :: CopyMeasurements (CGRect, CGContext *, __CFDictionary const *, __CFArray const *) | CUIRenderer :: CopyImageMeasurements (lang, CUIContext const *, __CFArray const *, __CFDictionary *) | CreateImageSourceFromDisk (lang, CUIContext const *, lang *, unsigniert char *) | CUISharedArtReader :: CreateImageSource (lang) | CGImageSourceCreateWithDataProvider | CGImageReadCreateWithProvider | CGImageReadCreateWithData | _CGImageReadCreate | _CFRuntimeCreateInstance | CFAllocatorAllocate | auto_zone_allocate_object Aufruf [4] [arg = 0]: thread_b0103000 | thread_start | _pthread_start | auto_collection_thread (void *) | auto_collect_with_mode (Auto :: Zone *, unsigned int) | auto_collect_internal (Auto :: Zone *, int)

Antwort

2

Es ist tatsächlich in einer niedrigeren Ebene Framework von Xcode verwendet, und jede Garbage-Collected-Anwendung, die NSImage verwendet wird auch generieren diese gleiche (harmlos, aber ärgerlich) Nachricht.

Eine Möglichkeit, diese zum Schweigen zu bringen ist hier: http://0xced.blogspot.com/2008/09/quietxcode.html

+0

Das ist genau das, was ich wissen musste, und diese App sieht so aus, als wäre sie ein guter Weg, um die Nachrichten loszuwerden. Vielen Dank! –

+0

Nur ein Hinweis, dass QuietXcode nur die von Xcode stammenden Nicht-Null-Retain-Count-Nachrichten zu beruhigen scheint, nicht die aus meiner App. Trotzdem lohnt sich die Installation. –

0

Ich sehe diese ganze Zeit mit Xcode. Es ist ein Speicherverwaltungsproblem in Xcode selbst und überhaupt nichts mit Ihrem Programm zu tun.

Wenn die Fehler mit Ihrem Programm zusammenhängen, werden sie im Debugging-Fenster (das beim Drücken von Shift-Command-r angezeigt wird) sowie in der Systemkonsole angezeigt.

Diese Xcode malloc-Nachrichten werden nur in der Systemkonsole angezeigt und sind daher nicht Ihr Problem.

Nun, diese Ausgabe von Apple, die eine IDE veröffentlicht, die Tonnen von Speicherfehlerprotokollen in die Systemkonsole ablegt? Das könnte etwas zu kümmern sein :)

+0

Diese werden direkt im Debug-Fenster kommen, voran meine meine appname statt Xcode (übrigens die, die in der Systemkonsole über Sie sprechen tun). Ich werde die Frage bearbeiten, um das klarer zu machen. –

+0

In diesem Fall ist es definitiv Ihr Programm, das sie wirft. Ich habe den GC nicht verwendet, daher befürchte ich, dass ich beim Debuggen nicht viel Hilfe haben werde. Viel Glück! –