From: David Elliott Date: Fri, 8 Feb 2008 00:35:39 +0000 (+0000) Subject: Add wxGCSafeRetain/wxGCSafeRelease to the vast majority of wxCocoa code. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/6a5c31c2853ed9e6290da4b534bd4078e961e438 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/trunk@51585 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/cocoa/bitmap.mm b/src/cocoa/bitmap.mm index 7d04461049..58f1c729fb 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 @@ -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; } 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 e371df92cd..cd4cc76174 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 @@ -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]; diff --git a/src/cocoa/pen.mm b/src/cocoa/pen.mm index 5920dc035a..d94b138c1a 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 // ======================================================================== @@ -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; } } diff --git a/src/cocoa/toplevel.mm b/src/cocoa/toplevel.mm index a23e990cab..b4b55f1b53 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 8bb0a6567c..8449277a89 100644 --- a/src/cocoa/window.mm +++ b/src/cocoa/window.mm @@ -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 #import @@ -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]);