#import namespace { extern "C" void objc_copyCppObjectAtomic(void *dest, const void *src, void (*copyHelper) (void *dest, const void *source)) { copyHelper(dest, src); } } static int count; class Foo { static int sNextId; int mId; int mRefId; public: Foo(const Foo& rhs){ mId = sNextId++; mRefId = rhs.mId; printf("Foo(%d,%d)\n", mId, mRefId); }; Foo() { mId = sNextId++; mRefId = mId; printf("Foo(%d,%d)\n", mId,mRefId); } ~Foo(){ printf("~Foo(%d, %d)\n", mId, mRefId); }; Foo& operator=(const Foo& rhs){ mRefId = rhs.mRefId; return *this; }; int Data() { return fData; }; private: int fData; }; int Foo::sNextId = 0; #pragma mark - @interface TNSObject : NSObject { @private Foo _cppObjectNonAtomic; Foo _cppObjectAtomic; Foo _cppObjectDynamic; } @property (assign, readwrite, nonatomic) const Foo& cppObjectNonAtomic; @property (assign, readwrite) const Foo cppObjectAtomic; @property (assign, readwrite, nonatomic) const Foo& cppObjectDynamic; @end #pragma mark - @implementation TNSObject @synthesize cppObjectNonAtomic = _cppObjectNonAtomic; @synthesize cppObjectAtomic = _cppObjectAtomic; @dynamic cppObjectDynamic; - (id)init { self = [super init]; if (self) { // Add your subclass-specific initialization here. // If an error occurs here, send a [self release] message and return nil. Foo cppObject; self.cppObjectNonAtomic = cppObject; self.cppObjectAtomic = cppObject; self.cppObjectDynamic = cppObject; } return self; } - (const Foo&) cppObjectDynamic { return _cppObjectDynamic; } - (void) setCppObjectDynamic: (const Foo&)cppObject { _cppObjectDynamic = cppObject; } @end #pragma mark - int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; [[[TNSObject alloc] init] autorelease]; [pool drain]; return 0; }