struct objc_ptr { ~objc_ptr() {}; static std::shared_ptr create (Type* object) { return std::shared_ptr (new objc_ptr (object)); } Type* get() { return static_cast (objectHolder.nonretainedObjectValue); }; private: objc_ptr (Type* object) { objectHolder = [NSValue valueWithNonretainedObject: object]; }; NSValue* objectHolder = nil; };