]> git.saurik.com Git - wxWidgets.git/commitdiff
Add wxGCSafeRetain/wxGCSafeRelease to the vast majority of wxCocoa code.
authorDavid Elliott <dfe@tgwbd.org>
Fri, 8 Feb 2008 00:35:39 +0000 (00:35 +0000)
committerDavid Elliott <dfe@tgwbd.org>
Fri, 8 Feb 2008 00:35:39 +0000 (00:35 +0000)
Copyright 2008 Software 2000 Ltd.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51585 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/cocoa/bitmap.mm
src/cocoa/colour.mm
src/cocoa/dc.mm
src/cocoa/pen.mm
src/cocoa/toplevel.mm
src/cocoa/window.mm

index 7d04461049f6904dac96b838cbd7aa1de4d04f31..58f1c729fbe7f789e51277cf3cf55b54229e75bf 100644 (file)
@@ -27,6 +27,7 @@
 
 #include "wx/cocoa/autorelease.h"
 #include "wx/cocoa/string.h"
+#include "wx/cocoa/ObjcRef.h"
 
 #import <AppKit/NSBitmapImageRep.h>
 #import <AppKit/NSGraphics.h>
@@ -76,6 +77,8 @@ wxBitmapRefData::wxBitmapRefData()
 
 wxBitmapRefData::wxBitmapRefData( const wxBitmapRefData& data)
 {
+    wxAutoNSAutoreleasePool pool;
+
     m_width = data.m_width;
     m_height = data.m_height;
     m_depth = data.m_depth;
@@ -83,13 +86,13 @@ wxBitmapRefData::wxBitmapRefData( const wxBitmapRefData& data)
     m_numColors = data.m_numColors;
     m_bitmapPalette = data.m_bitmapPalette;
     m_quality = data.m_quality;
-    m_cocoaNSBitmapImageRep = [data.m_cocoaNSBitmapImageRep copyWithZone:nil];
+    m_cocoaNSBitmapImageRep = wxGCSafeRetain([[data.m_cocoaNSBitmapImageRep copyWithZone:nil] autorelease]);
     m_bitmapMask = data.m_bitmapMask?new wxMask(*data.m_bitmapMask):NULL;
 }
 
 wxBitmapRefData::~wxBitmapRefData()
 {
-    [m_cocoaNSBitmapImageRep release];
+    wxGCSafeRelease(m_cocoaNSBitmapImageRep);
     m_cocoaNSBitmapImageRep = NULL;
 
     delete m_bitmapMask;
@@ -195,8 +198,8 @@ void wxBitmap::SetNSBitmapImageRep(WX_NSBitmapImageRep bitmapImageRep)
     if(!M_BITMAPDATA)
         return;
     // NOTE: No checking is done to make sure width/height agree
-    [bitmapImageRep retain];
-    [M_BITMAPDATA->m_cocoaNSBitmapImageRep release];
+    wxGCSafeRetain(bitmapImageRep);
+    wxGCSafeRelease(M_BITMAPDATA->m_cocoaNSBitmapImageRep);
     M_BITMAPDATA->m_cocoaNSBitmapImageRep = bitmapImageRep;
 }
 
@@ -293,6 +296,8 @@ int wxBitmap::GetHeight() const
 
 bool wxBitmap::Create(int w, int h, int d)
 {
+    wxAutoNSAutoreleasePool pool;
+
     UnRef();
 
     m_refData = new wxBitmapRefData;
@@ -302,7 +307,7 @@ bool wxBitmap::Create(int w, int h, int d)
     M_BITMAPDATA->m_depth = d;
 
     /* TODO: create new bitmap */
-    M_BITMAPDATA->m_cocoaNSBitmapImageRep = [[NSBitmapImageRep alloc]
+    M_BITMAPDATA->m_cocoaNSBitmapImageRep = wxGCSafeRetain([[[NSBitmapImageRep alloc]
             initWithBitmapDataPlanes: NULL
             pixelsWide: w
             pixelsHigh: h
@@ -313,7 +318,7 @@ bool wxBitmap::Create(int w, int h, int d)
             colorSpaceName: NSCalibratedRGBColorSpace
             bytesPerRow: 0  // NOTE: Contrary to Apple documentation Mac OS
                             // 10.4 will add padding bytes when 0 is used here
-            bitsPerPixel: 0];
+            bitsPerPixel: 0] autorelease]);
 
     wxLogTrace(wxTRACE_COCOA,wxT("M_BITMAPDATA=%p NSBitmapImageRep bitmapData=%p"), M_BITMAPDATA, [M_BITMAPDATA->m_cocoaNSBitmapImageRep bitmapData]);
     M_BITMAPDATA->m_ok = true;
@@ -342,7 +347,7 @@ bool wxBitmap::LoadFile(const wxString& filename, wxBitmapType type)
         M_BITMAPDATA->m_ok = true;
         M_BITMAPDATA->m_numColors = 0;
         M_BITMAPDATA->m_quality = 0;
-        M_BITMAPDATA->m_cocoaNSBitmapImageRep = [imageRep retain];
+        M_BITMAPDATA->m_cocoaNSBitmapImageRep = wxGCSafeRetain(imageRep);
         M_BITMAPDATA->m_bitmapMask = NULL;
         return true;
     }
@@ -374,7 +379,7 @@ bool wxBitmap::Create(NSBitmapImageRep *imageRep)
         M_BITMAPDATA->m_ok = true;
         M_BITMAPDATA->m_numColors = 0;
         M_BITMAPDATA->m_quality = 0;
-        M_BITMAPDATA->m_cocoaNSBitmapImageRep = [imageRep retain];
+        M_BITMAPDATA->m_cocoaNSBitmapImageRep = wxGCSafeRetain(imageRep);
         M_BITMAPDATA->m_bitmapMask = NULL;
         return true;
     }
@@ -407,12 +412,12 @@ bool wxBitmap::CopyFromIcon(const wxIcon& icon)
     NSRect imageRect;
     imageRect.origin.x = imageRect.origin.y = 0.0;
     imageRect.size = [icon.GetNSImage() size];
-    NSBitmapImageRep *newBitmapRep = [[NSBitmapImageRep alloc] initWithFocusedViewRect:imageRect];
+    NSBitmapImageRep *newBitmapRep = [[[NSBitmapImageRep alloc] initWithFocusedViewRect:imageRect] autorelease];
     [icon.GetNSImage() unlockFocus];
     if(!newBitmapRep)
         return false;
     m_refData = new wxBitmapRefData;
-    M_BITMAPDATA->m_cocoaNSBitmapImageRep = newBitmapRep;
+    M_BITMAPDATA->m_cocoaNSBitmapImageRep = wxGCSafeRetain(newBitmapRep);
     M_BITMAPDATA->m_width = [newBitmapRep pixelsWide];
     M_BITMAPDATA->m_height = [newBitmapRep pixelsHigh];
     M_BITMAPDATA->m_depth = [newBitmapRep bitsPerSample]*[newBitmapRep samplesPerPixel];
@@ -471,6 +476,7 @@ wxImage wxBitmap::ConvertToImage() const
 
 bool wxBitmap::CreateFromImage(const wxImage& image, int depth)
 {
+    wxAutoNSAutoreleasePool pool;
     UnRef();
 
     wxCHECK_MSG(image.Ok(), false, wxT("invalid image"));
@@ -480,7 +486,7 @@ bool wxBitmap::CreateFromImage(const wxImage& image, int depth)
 
     M_BITMAPDATA->m_width = image.GetWidth();
     M_BITMAPDATA->m_height = image.GetHeight();
-    NSBitmapImageRep *bitmapImage = [[NSBitmapImageRep alloc]
+    NSBitmapImageRep *bitmapImage = [[[NSBitmapImageRep alloc]
             initWithBitmapDataPlanes: NULL
             pixelsWide: image.GetWidth()
             pixelsHigh: image.GetHeight()
@@ -490,7 +496,7 @@ bool wxBitmap::CreateFromImage(const wxImage& image, int depth)
             isPlanar: NO
             colorSpaceName: NSCalibratedRGBColorSpace
             bytesPerRow: image.GetWidth()*3
-            bitsPerPixel: 0];
+            bitsPerPixel: 0] autorelease];
 
     // TODO: Specify bytesPerRow:0 and then use [bitmapImage bytesPerRow]
     // so that the rows are aligned suitably for altivec by the OS (Tiger)
@@ -501,7 +507,7 @@ bool wxBitmap::CreateFromImage(const wxImage& image, int depth)
     M_BITMAPDATA->m_ok = true;
     M_BITMAPDATA->m_numColors = 0;
     M_BITMAPDATA->m_quality = 0;
-    M_BITMAPDATA->m_cocoaNSBitmapImageRep = bitmapImage;
+    M_BITMAPDATA->m_cocoaNSBitmapImageRep = wxGCSafeRetain(bitmapImage);
     M_BITMAPDATA->m_bitmapMask = new wxMask(*this,wxColour(image.GetMaskRed(),image.GetMaskGreen(),image.GetMaskBlue()));
     return true;
 }
@@ -576,13 +582,13 @@ wxMask::wxMask(const wxBitmap& bitmap)
 // Copy constructor
 wxMask::wxMask(const wxMask& src)
 :   wxObject(src)
-,   m_cocoaNSBitmapImageRep([src.m_cocoaNSBitmapImageRep retain])
+,   m_cocoaNSBitmapImageRep(wxGCSafeRetain(src.m_cocoaNSBitmapImageRep))
 {
 }
 
 wxMask::~wxMask()
 {
-    [m_cocoaNSBitmapImageRep release];
+    wxGCSafeRelease(m_cocoaNSBitmapImageRep);
 }
 
 // Create a mask from a mono bitmap (copies the bitmap).
@@ -717,6 +723,6 @@ bool wxMask::Create(const wxBitmap& bitmap, const wxColour& colour)
     {   wxCHECK_MSG(false,false,wxT("Unimplemented pixel format")); }
 
     // maskRep was autoreleased in case we had to exit quickly
-    m_cocoaNSBitmapImageRep = [maskRep retain];
+    m_cocoaNSBitmapImageRep = wxGCSafeRetain(maskRep);
     return true;
 }
index 914408e291fbb1fc10d727aa80c340f800d7ba2b..9598fe838cd665c287875c4f15f3755251400fdf 100644 (file)
@@ -18,6 +18,7 @@
 #endif //WX_PRECOMP
 
 #include "wx/cocoa/autorelease.h"
+#include "wx/cocoa/ObjcRef.h"
 
 #import <AppKit/NSColor.h>
 
@@ -38,7 +39,7 @@ wxColour::wxColour (const wxColour& col)
 ,   m_blue(col.m_blue)
 ,   m_alpha(col.m_alpha)
 {
-    [m_cocoaNSColor retain];
+    wxGCSafeRetain(m_cocoaNSColor);
 }
 
 wxColour::wxColour( WX_NSColor aColor )
@@ -49,18 +50,17 @@ wxColour::wxColour( WX_NSColor aColor )
 
 wxColour& wxColour::operator =(const wxColour& col)
 {
-    m_cocoaNSColor = col.m_cocoaNSColor;
+    m_cocoaNSColor = wxGCSafeRetain(col.m_cocoaNSColor);
     m_red = col.m_red;
     m_green = col.m_green;
     m_blue = col.m_blue;
     m_alpha = col.m_alpha;
-    [m_cocoaNSColor retain];
     return *this;
 }
 
 wxColour::~wxColour ()
 {
-    [m_cocoaNSColor release];
+    wxGCSafeRelease(m_cocoaNSColor);
 }
 
 void wxColour::InitRGBA(unsigned char r,
@@ -69,8 +69,8 @@ void wxColour::InitRGBA(unsigned char r,
                         unsigned char a)
 {
     wxAutoNSAutoreleasePool pool;
-    [m_cocoaNSColor release];
-    m_cocoaNSColor = [[NSColor colorWithCalibratedRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:a/255.0] retain];
+    wxGCSafeRelease(m_cocoaNSColor);
+    m_cocoaNSColor = wxGCSafeRetain([NSColor colorWithCalibratedRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:a/255.0]);
     m_red = r;
     m_green = g;
     m_blue = b;
@@ -79,8 +79,8 @@ void wxColour::InitRGBA(unsigned char r,
 
 void wxColour::Set( WX_NSColor aColor )
 {
-    [aColor retain];
-    [m_cocoaNSColor release];
+    wxGCSafeRetain(aColor);
+    wxGCSafeRelease(m_cocoaNSColor);
     m_cocoaNSColor = aColor;
 
     /* Make a temporary color in RGB format and get the values.  Note that
index e371df92cd4e145ea43e663b989881fd1c7f4707..cd4cc76174cb23fd75a0fa87be26d20f9c801067 100644 (file)
@@ -20,6 +20,7 @@
 
 #include "wx/cocoa/autorelease.h"
 #include "wx/cocoa/string.h"
+#include "wx/cocoa/ObjcRef.h"
 
 #import <AppKit/NSBezierPath.h>
 #import <AppKit/NSTextStorage.h>
@@ -75,11 +76,16 @@ inline void CocoaSetPenForNSBezierPath(wxPen &pen, NSBezierPath *bezpath)
 
 void wxCocoaDCImpl::CocoaInitializeTextSystem()
 {
+    wxAutoNSAutoreleasePool pool;
+
     wxASSERT_MSG(!sm_cocoaNSTextStorage && !sm_cocoaNSLayoutManager && !sm_cocoaNSTextContainer,wxT("Text system already initalized!  BAD PROGRAMMER!"));
 
-    sm_cocoaNSTextStorage = [[NSTextStorage alloc] init];
+    // FIXME: Never released
+    sm_cocoaNSTextStorage = wxGCSafeRetain([[[NSTextStorage alloc] init] autorelease]);
+
+    // FIXME: Never released
+    sm_cocoaNSLayoutManager = wxGCSafeRetain([[[NSLayoutManager alloc] init] autorelease]);
 
-    sm_cocoaNSLayoutManager = [[NSLayoutManager alloc] init];
     [sm_cocoaNSTextStorage addLayoutManager:sm_cocoaNSLayoutManager];
     // NSTextStorage retains NSLayoutManager, but so do we
     // [sm_cocoaNSLayoutManager release]; [sm_cocoaNSLayoutManager retain];
@@ -87,7 +93,8 @@ void wxCocoaDCImpl::CocoaInitializeTextSystem()
     // NOTE:  initWithContainerSize is the designated initializer, but the
     // Apple CircleView sample gets away with just calling init, which
     // is all we really need for our purposes.
-    sm_cocoaNSTextContainer = [[NSTextContainer alloc] init];
+    // FIXME: Never released
+    sm_cocoaNSTextContainer = wxGCSafeRetain([[[NSTextContainer alloc] init] autorelease]);
     [sm_cocoaNSLayoutManager addTextContainer:sm_cocoaNSTextContainer];
     // NSLayoutManager retains NSTextContainer, but so do we
     // [sm_cocoaNSTextContainer release]; [sm_cocoaNSTextContainer retain];
index 5920dc035a78f0f5a0095bf999e9bb5e35689d3c..d94b138c1a791af272214db3e8fa336c0fc00271 100644 (file)
@@ -17,6 +17,8 @@
     #include "wx/colour.h"
 #endif //WX_PRECOMP
 
+#include "wx/cocoa/ObjcRef.h"
+
 #import <AppKit/NSColor.h>
 
 // ========================================================================
@@ -133,13 +135,13 @@ inline wxPenRefData::wxPenRefData(const wxPenRefData& data)
     m_nbDash = data.m_nbDash;
     m_dash = data.m_dash;
     m_stipple = data.m_stipple;
-    m_cocoaNSColor = [data.m_cocoaNSColor retain];
+    m_cocoaNSColor = wxGCSafeRetain(data.m_cocoaNSColor);
     m_cocoaDash = NULL;
 }
 
 inline void wxPenRefData::FreeCocoaNSColor()
 {
-    [m_cocoaNSColor release];
+    wxGCSafeRelease(m_cocoaNSColor);
     m_cocoaNSColor = nil;
 }
 
@@ -156,7 +158,7 @@ inline WX_NSColor wxPenRefData::GetNSColor()
         switch( m_style )
         {
         case wxTRANSPARENT:
-            m_cocoaNSColor = [[NSColor clearColor] retain];
+            m_cocoaNSColor = wxGCSafeRetain([NSColor clearColor]);
             break;
         case wxSTIPPLE:
 //  wxBitmap isn't implemented yet
@@ -181,6 +183,7 @@ inline WX_NSColor wxPenRefData::GetNSColor()
             if(!colour_NSColor)
                 colour_NSColor = [NSColor clearColor];
             m_cocoaNSColor = [colour_NSColor copyWithZone:nil];
+            [wxGCSafeRetain(m_cocoaNSColor) release]; // retain in GC. no change in RR.
             break;
         }
     }
index a23e990cab669a12b59ecd430cf82431c659ce34..b4b55f1b530ea87b6d352f35a09910eb74bc274a 100644 (file)
@@ -32,6 +32,7 @@
 
 #include "wx/cocoa/autorelease.h"
 #include "wx/cocoa/string.h"
+#include "wx/cocoa/ObjcRef.h"
 
 #include "wx/cocoa/objc/NSView.h"
 #include "wx/cocoa/objc/NSWindow.h"
@@ -190,8 +191,8 @@ void wxTopLevelWindowCocoa::SetNSWindow(WX_NSWindow cocoaNSWindow)
     bool need_debug = cocoaNSWindow || m_cocoaNSWindow;
     if(need_debug) wxLogTrace(wxTRACE_COCOA_RetainRelease,wxT("wxTopLevelWindowCocoa=%p::SetNSWindow [m_cocoaNSWindow=%p retainCount]=%d"),this,m_cocoaNSWindow,[m_cocoaNSWindow retainCount]);
     DisassociateNSWindow(m_cocoaNSWindow);
-    [cocoaNSWindow retain];
-    [m_cocoaNSWindow release];
+    wxGCSafeRetain(cocoaNSWindow);
+    wxGCSafeRelease(m_cocoaNSWindow);
     m_cocoaNSWindow = cocoaNSWindow;
     // NOTE: We are no longer using posing so we won't get events on the
     // window's view unless it was explicitly created as the wx view class.
index 8bb0a6567cf9c94cd1c26be114425904b5f3f23d..8449277a890243996102c5f838ac249da583c70f 100644 (file)
@@ -26,6 +26,7 @@
 #include "wx/cocoa/string.h"
 #include "wx/cocoa/trackingrectmanager.h"
 #include "wx/mac/corefoundation/cfref.h"
+#include "wx/cocoa/ObjcRef.h"
 
 #import <Foundation/NSArray.h>
 #import <Foundation/NSRunLoop.h>
@@ -1109,8 +1110,8 @@ void wxWindowCocoa::SetNSView(WX_NSView cocoaNSView)
     bool need_debug = cocoaNSView || m_cocoaNSView;
     if(need_debug) wxLogTrace(wxTRACE_COCOA_RetainRelease,wxT("wxWindowCocoa=%p::SetNSView [m_cocoaNSView=%p retainCount]=%d"),this,m_cocoaNSView,[m_cocoaNSView retainCount]);
     DisassociateNSView(m_cocoaNSView);
-    [cocoaNSView retain];
-    [m_cocoaNSView release];
+    wxGCSafeRetain(cocoaNSView);
+    wxGCSafeRelease(m_cocoaNSView);
     m_cocoaNSView = cocoaNSView;
     AssociateNSView(m_cocoaNSView);
     if(need_debug) wxLogTrace(wxTRACE_COCOA_RetainRelease,wxT("wxWindowCocoa=%p::SetNSView [cocoaNSView=%p retainCount]=%d"),this,cocoaNSView,[cocoaNSView retainCount]);