Added wxObjcAutoRef* classes for automatic retain/release of Objective-C objects

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@26580 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
David Elliott 2004-04-02 17:43:59 +00:00
parent 2317613101
commit fa8114de44
2 changed files with 101 additions and 0 deletions

View File

@ -0,0 +1,76 @@
/////////////////////////////////////////////////////////////////////////////
// Name: wx/cocoa/ObjcRef.h
// Purpose: wxObjcAutoRef template class
// Author: David Elliott
// Modified by:
// Created: 2004/03/28
// RCS-ID: $Id$
// Copyright: (c) 2004 David Elliott <dfe@cox.net>
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
/*
wxObjcAutoRefFromAlloc: construct a reference to an object that was
[NSObject -alloc]'ed and thus does not need a retain
wxObjcAutoRef: construct a reference to an object that was
either autoreleased or is retained by something else.
*/
struct objc_object;
// We must do any calls to Objective-C from an Objective-C++ source file
class wxObjcAutoRefBase
{
protected:
static struct objc_object* ObjcRetain(struct objc_object*);
static struct objc_object* ObjcRelease(struct objc_object*);
};
// T should be a pointer like NSObject*
template <class T>
class wxObjcAutoRefFromAlloc: wxObjcAutoRefBase
{
public:
wxObjcAutoRefFromAlloc(T p = 0)
: m_ptr(p)
// NOTE: this is from alloc. Do NOT retain
{}
wxObjcAutoRefFromAlloc(const wxObjcAutoRefFromAlloc& otherRef)
: m_ptr(otherRef.m_ptr)
{ ObjcRetain(m_ptr); }
~wxObjcAutoRefFromAlloc()
{ ObjcRelease(m_ptr); }
wxObjcAutoRefFromAlloc& operator=(const wxObjcAutoRefFromAlloc& otherRef)
{ ObjcRetain(otherRef.m_ptr);
ObjcRelease(m_ptr);
m_ptr = otherRef.m_ptr;
return *this;
}
operator T() const
{ return m_ptr; }
T operator->() const
{ return m_ptr; }
protected:
T m_ptr;
};
// The only thing wxObjcAutoRef has to do is retain an initial object
template <class T>
class wxObjcAutoRef: public wxObjcAutoRefFromAlloc<T>
{
public:
wxObjcAutoRef(T p = 0)
: wxObjcAutoRefFromAlloc<T>(p)
{ ObjcRetain(m_ptr); }
~wxObjcAutoRef() {}
wxObjcAutoRef(const wxObjcAutoRef& otherRef)
: wxObjcAutoRefFromAlloc<T>(otherRef)
{}
wxObjcAutoRef(const wxObjcAutoRefFromAlloc<T>& otherRef)
: wxObjcAutoRefFromAlloc<T>(otherRef)
{}
wxObjcAutoRef& operator=(const wxObjcAutoRef& otherRef)
{ return wxObjcAutoRefFromAlloc<T>::operator=(otherRef); }
};

25
src/cocoa/ObjcRef.mm Normal file
View File

@ -0,0 +1,25 @@
/////////////////////////////////////////////////////////////////////////////
// Name: cocoa/ObjcRef.mm
// Purpose: wxObjcAutoRefBase implementation
// Author: David Elliott
// Modified by:
// Created: 2004/03/28
// RCS-ID: $Id$
// Copyright: (c) 2004 David Elliott <dfe@cox.net>
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#include "wx/cocoa/ObjcRef.h"
#include <Foundation/NSObject.h>
/*static*/ struct objc_object* wxObjcAutoRefBase::ObjcRetain(struct objc_object* obj)
{
return [obj retain];
}
/*static*/ struct objc_object* wxObjcAutoRefBase::ObjcRelease(struct objc_object* obj)
{
return [obj release];
}