From 08433260e81a45d3ddf17a40204a6e1a44e0e5ab Mon Sep 17 00:00:00 2001 From: David Elliott Date: Fri, 8 Feb 2008 00:35:39 +0000 Subject: [PATCH] Add wxGCSafeRetain/wxGCSafeRelease to the vast majority of wxCocoa code. Copyright 2008 Software 2000 Ltd. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_8_BRANCH@51585 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/cocoa/bitmap.mm | 38 ++++++++++++++++++++++---------------- src/cocoa/colour.mm | 16 ++++++++-------- src/cocoa/dc.mm | 13 ++++++++++--- src/cocoa/pen.mm | 9 ++++++--- src/cocoa/toplevel.mm | 5 +++-- src/cocoa/window.mm | 5 +++-- 6 files changed, 52 insertions(+), 34 deletions(-) diff --git a/src/cocoa/bitmap.mm b/src/cocoa/bitmap.mm index 42d2216ce1..848ad1cc2b 100644 --- a/src/cocoa/bitmap.mm +++ b/src/cocoa/bitmap.mm @@ -27,6 +27,7 @@ #include "wx/cocoa/autorelease.h" #include "wx/cocoa/string.h" +#include "wx/cocoa/ObjcRef.h" #import #import @@ -74,6 +75,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; @@ -81,13 +84,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; @@ -193,8 +196,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; } @@ -296,6 +299,8 @@ int wxBitmap::GetHeight() const bool wxBitmap::Create(int w, int h, int d) { + wxAutoNSAutoreleasePool pool; + UnRef(); m_refData = new wxBitmapRefData; @@ -305,7 +310,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 @@ -316,7 +321,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; @@ -345,7 +350,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; } @@ -377,7 +382,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; } @@ -410,12 +415,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]; @@ -474,6 +479,7 @@ wxImage wxBitmap::ConvertToImage() const bool wxBitmap::CreateFromImage(const wxImage& image, int depth) { + wxAutoNSAutoreleasePool pool; UnRef(); wxCHECK_MSG(image.Ok(), false, wxT("invalid image")); @@ -483,7 +489,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() @@ -493,7 +499,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) @@ -504,7 +510,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; } @@ -583,13 +589,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). @@ -724,6 +730,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; } diff --git a/src/cocoa/colour.mm b/src/cocoa/colour.mm index 914408e291..9598fe838c 100644 --- a/src/cocoa/colour.mm +++ b/src/cocoa/colour.mm @@ -18,6 +18,7 @@ #endif //WX_PRECOMP #include "wx/cocoa/autorelease.h" +#include "wx/cocoa/ObjcRef.h" #import @@ -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 diff --git a/src/cocoa/dc.mm b/src/cocoa/dc.mm index 37f870198e..017c81c932 100644 --- a/src/cocoa/dc.mm +++ b/src/cocoa/dc.mm @@ -20,6 +20,7 @@ #include "wx/cocoa/autorelease.h" #include "wx/cocoa/string.h" +#include "wx/cocoa/ObjcRef.h" #import #import @@ -74,11 +75,16 @@ inline void CocoaSetPenForNSBezierPath(wxPen &pen, NSBezierPath *bezpath) void wxDC::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]; @@ -86,7 +92,8 @@ void wxDC::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]; diff --git a/src/cocoa/pen.mm b/src/cocoa/pen.mm index 0968133ffc..c370e07ed0 100644 --- a/src/cocoa/pen.mm +++ b/src/cocoa/pen.mm @@ -17,6 +17,8 @@ #include "wx/colour.h" #endif //WX_PRECOMP +#include "wx/cocoa/ObjcRef.h" + #import // ======================================================================== @@ -131,13 +133,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; } @@ -154,7 +156,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 @@ -179,6 +181,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; } } diff --git a/src/cocoa/toplevel.mm b/src/cocoa/toplevel.mm index b2f2652b2c..a3eb162875 100644 --- a/src/cocoa/toplevel.mm +++ b/src/cocoa/toplevel.mm @@ -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. diff --git a/src/cocoa/window.mm b/src/cocoa/window.mm index 413f00d7e7..9354e80362 100644 --- a/src/cocoa/window.mm +++ b/src/cocoa/window.mm @@ -24,6 +24,7 @@ #include "wx/cocoa/string.h" #include "wx/cocoa/trackingrectmanager.h" #include "wx/mac/corefoundation/cfref.h" +#include "wx/cocoa/ObjcRef.h" #import #import @@ -1116,8 +1117,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]);