Cocoa: fix memory leaks
authorTeemu Katajisto <teemu.katajisto@digia.com>
Mon, 22 Oct 2012 11:55:00 +0000 (14:55 +0300)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Tue, 6 Nov 2012 21:06:28 +0000 (22:06 +0100)
Change-Id: I2e805aa64c65b90d33924ea4a8671735dee581fd
Reviewed-by: Morten Johan Sørvig <morten.sorvig@digia.com>
src/plugins/platforms/cocoa/qcocoawindow.h
src/plugins/platforms/cocoa/qcocoawindow.mm
src/plugins/platforms/cocoa/qmacclipboard.mm
src/plugins/platforms/cocoa/qnsview.mm

index db3a20c..a9ea135 100644 (file)
@@ -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;
index de6e7dc..b9c5a40 100644 (file)
@@ -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
index e7c0372..e8d12ab 100644 (file)
@@ -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!");
index d62913a..bbd74dd 100644 (file)
@@ -263,6 +263,7 @@ static CGImageRef qt_mac_toCGImage(QImage *qImage, bool isMask, uchar **dataCopy
                                 kCGRenderingIntentDefault);
         CGColorSpaceRelease(cgColourSpaceRef);
     }
+    CGDataProviderRelease(cgDataProviderRef);
     return cgImage;
 }