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
This commit is contained in:
David Elliott
2008-02-08 00:35:39 +00:00
parent f42fc2c1a7
commit 08433260e8
6 changed files with 52 additions and 34 deletions

View 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>
@@ -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;
}

View 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

View 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>
@@ -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];

View File

@@ -17,6 +17,8 @@
#include "wx/colour.h"
#endif //WX_PRECOMP
#include "wx/cocoa/ObjcRef.h"
#import <AppKit/NSColor.h>
// ========================================================================
@@ -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;
}
}

View 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.

View File

@@ -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 <Foundation/NSArray.h>
#import <Foundation/NSRunLoop.h>
@@ -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]);