From 8e22d05dc908cf7f4f8d20ece012520d98707ee8 Mon Sep 17 00:00:00 2001 From: Teemu Katajisto Date: Mon, 22 Oct 2012 14:55:00 +0300 Subject: Cocoa: fix memory leaks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I2e805aa64c65b90d33924ea4a8671735dee581fd Reviewed-by: Morten Johan Sørvig --- src/plugins/platforms/cocoa/qcocoawindow.h | 3 +++ src/plugins/platforms/cocoa/qcocoawindow.mm | 8 ++++++-- src/plugins/platforms/cocoa/qmacclipboard.mm | 5 ++++- src/plugins/platforms/cocoa/qnsview.mm | 1 + 4 files changed, 14 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/plugins/platforms/cocoa/qcocoawindow.h b/src/plugins/platforms/cocoa/qcocoawindow.h index db3a20c2be..a9ea135b3e 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.h +++ b/src/plugins/platforms/cocoa/qcocoawindow.h @@ -66,6 +66,8 @@ class QT_PREPEND_NAMESPACE(QCocoaWindow); - (BOOL)canBecomeKeyWindow; @end +@class QNSWindowDelegate; + QT_BEGIN_NAMESPACE // QCocoaWindow // @@ -157,6 +159,7 @@ public: // for QNSView QNSView *m_contentView; NSWindow *m_nsWindow; + QNSWindowDelegate *m_nsWindowDelegate; Qt::WindowFlags m_windowFlags; Qt::WindowState m_synchedWindowState; Qt::WindowModality m_windowModality; diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm index de6e7dc43e..b9c5a401d0 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.mm +++ b/src/plugins/platforms/cocoa/qcocoawindow.mm @@ -186,6 +186,7 @@ static bool isMouseEvent(NSEvent *ev) QCocoaWindow::QCocoaWindow(QWindow *tlw) : QPlatformWindow(tlw) , m_nsWindow(0) + , m_nsWindowDelegate(0) , m_synchedWindowState(Qt::WindowActive) , m_windowModality(Qt::NonModal) , m_inConstructor(true) @@ -217,6 +218,7 @@ QCocoaWindow::~QCocoaWindow() clearNSWindow(m_nsWindow); [m_contentView release]; [m_nsWindow release]; + [m_nsWindowDelegate release]; } void QCocoaWindow::setGeometry(const QRect &rect) @@ -619,6 +621,8 @@ void QCocoaWindow::recreateWindow(const QPlatformWindow *parentWindow) [m_nsWindow close]; [m_nsWindow release]; m_nsWindow = 0; + [m_nsWindowDelegate release]; + m_nsWindowDelegate = 0; } if (!parentWindow) { @@ -697,8 +701,8 @@ NSWindow * QCocoaWindow::createNSWindow() void QCocoaWindow::setNSWindow(NSWindow *window) { - QNSWindowDelegate *delegate = [[QNSWindowDelegate alloc] initWithQCocoaWindow:this]; - [window setDelegate:delegate]; + m_nsWindowDelegate = [[QNSWindowDelegate alloc] initWithQCocoaWindow:this]; + [window setDelegate:m_nsWindowDelegate]; [window setAcceptsMouseMovedEvents:YES]; // Prevent Cocoa from releasing the window on close. Qt diff --git a/src/plugins/platforms/cocoa/qmacclipboard.mm b/src/plugins/platforms/cocoa/qmacclipboard.mm index e7c03726d6..e8d12abaed 100644 --- a/src/plugins/platforms/cocoa/qmacclipboard.mm +++ b/src/plugins/platforms/cocoa/qmacclipboard.mm @@ -193,7 +193,10 @@ QMacPasteboard::hasOSType(int c_flavor) const const int type_count = CFArrayGetCount(types); for (int i = 0; i < type_count; ++i) { CFStringRef flavor = (CFStringRef)CFArrayGetValueAtIndex(types, i); - const int os_flavor = UTGetOSTypeFromString(UTTypeCopyPreferredTagWithClass(flavor, kUTTagClassOSType)); + CFStringRef preferredTag = UTTypeCopyPreferredTagWithClass(flavor, kUTTagClassOSType); + const int os_flavor = UTGetOSTypeFromString(preferredTag); + if (preferredTag) + CFRelease(preferredTag); if (os_flavor == c_flavor) { #ifdef DEBUG_PASTEBOARD qDebug(" - Found!"); diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm index d62913a7af..bbd74dd58b 100644 --- a/src/plugins/platforms/cocoa/qnsview.mm +++ b/src/plugins/platforms/cocoa/qnsview.mm @@ -263,6 +263,7 @@ static CGImageRef qt_mac_toCGImage(QImage *qImage, bool isMask, uchar **dataCopy kCGRenderingIntentDefault); CGColorSpaceRelease(cgColourSpaceRef); } + CGDataProviderRelease(cgDataProviderRef); return cgImage; } -- cgit v1.2.3