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:
parent
2317613101
commit
fa8114de44
76
include/wx/cocoa/ObjcRef.h
Normal file
76
include/wx/cocoa/ObjcRef.h
Normal 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
25
src/cocoa/ObjcRef.mm
Normal 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];
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user