Skip to content

Commit cc5d403

Browse files
authored
Wrap the App Check Obj C pointers to fix memory issues (#1287)
* Wrap the Obj C objects to fix memory errors * Formatting
1 parent 7f5a572 commit cc5d403

File tree

4 files changed

+31
-6
lines changed

4 files changed

+31
-6
lines changed

app_check/src/ios/debug_provider_ios.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717

1818
#include <map>
1919

20+
#include "app/memory/unique_ptr.h"
21+
#include "app/src/util_ios.h"
2022
#include "firebase/app_check.h"
2123

2224
#ifdef __OBJC__
@@ -27,6 +29,11 @@ namespace firebase {
2729
namespace app_check {
2830
namespace internal {
2931

32+
// This defines the class FIRAppCheckDebugProviderFactoryPointer, which is a
33+
// C++-compatible wrapper around the FIRAppCheckDebugProviderFactory Obj-C
34+
// class.
35+
OBJ_C_PTR_WRAPPER(FIRAppCheckDebugProviderFactory);
36+
3037
class DebugAppCheckProviderFactoryInternal : public AppCheckProviderFactory {
3138
public:
3239
DebugAppCheckProviderFactoryInternal();
@@ -37,9 +44,14 @@ class DebugAppCheckProviderFactoryInternal : public AppCheckProviderFactory {
3744

3845
private:
3946
#ifdef __OBJC__
40-
FIRAppCheckDebugProviderFactory* ios_provider_factory_;
47+
FIRAppCheckDebugProviderFactory* ios_provider_factory() const {
48+
return ios_provider_factory_->get();
49+
}
4150
#endif // __OBJC__
4251

52+
// Object lifetime managed by Objective C ARC.
53+
UniquePtr<FIRAppCheckDebugProviderFactoryPointer> ios_provider_factory_;
54+
4355
std::map<App*, AppCheckProvider*> created_providers_;
4456
};
4557

app_check/src/ios/debug_provider_ios.mm

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ virtual void GetToken(
5959

6060
DebugAppCheckProviderFactoryInternal::DebugAppCheckProviderFactoryInternal()
6161
: created_providers_() {
62-
ios_provider_factory_ = [[FIRAppCheckDebugProviderFactory alloc] init];
62+
ios_provider_factory_ = MakeUnique<FIRAppCheckDebugProviderFactoryPointer>(
63+
[[FIRAppCheckDebugProviderFactory alloc] init]);
6364
}
6465

6566
DebugAppCheckProviderFactoryInternal::~DebugAppCheckProviderFactoryInternal() {
@@ -78,7 +79,7 @@ virtual void GetToken(
7879
}
7980
// Otherwise, create a new provider
8081
FIRAppCheckDebugProvider* ios_provider =
81-
[ios_provider_factory_ createProviderWithApp:app->GetPlatformApp()];
82+
[ios_provider_factory() createProviderWithApp:app->GetPlatformApp()];
8283
AppCheckProvider* cpp_provider = new internal::DebugAppCheckProvider(ios_provider);
8384
created_providers_[app] = cpp_provider;
8485
return cpp_provider;

app_check/src/ios/device_check_provider_ios.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717

1818
#include <map>
1919

20+
#include "app/memory/unique_ptr.h"
21+
#include "app/src/util_ios.h"
2022
#include "firebase/app_check.h"
2123

2224
#ifdef __OBJC__
@@ -27,6 +29,10 @@ namespace firebase {
2729
namespace app_check {
2830
namespace internal {
2931

32+
// This defines the class FIRDeviceCheckProviderFactoryPointer, which is a
33+
// C++-compatible wrapper around the FIRDeviceCheckProviderFactory Obj-C class.
34+
OBJ_C_PTR_WRAPPER(FIRDeviceCheckProviderFactory);
35+
3036
class DeviceCheckProviderFactoryInternal : public AppCheckProviderFactory {
3137
public:
3238
DeviceCheckProviderFactoryInternal();
@@ -37,9 +43,14 @@ class DeviceCheckProviderFactoryInternal : public AppCheckProviderFactory {
3743

3844
private:
3945
#ifdef __OBJC__
40-
FIRDeviceCheckProviderFactory* ios_provider_factory_;
46+
FIRDeviceCheckProviderFactory* ios_provider_factory() const {
47+
return ios_provider_factory_->get();
48+
}
4149
#endif // __OBJC__
4250

51+
// Object lifetime managed by Objective C ARC.
52+
UniquePtr<FIRDeviceCheckProviderFactoryPointer> ios_provider_factory_;
53+
4354
std::map<App*, AppCheckProvider*> created_providers_;
4455
};
4556

app_check/src/ios/device_check_provider_ios.mm

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ virtual void GetToken(
5858
}
5959

6060
DeviceCheckProviderFactoryInternal::DeviceCheckProviderFactoryInternal() : created_providers_() {
61-
ios_provider_factory_ = [[FIRDeviceCheckProviderFactory alloc] init];
61+
ios_provider_factory_ = MakeUnique<FIRDeviceCheckProviderFactoryPointer>(
62+
[[FIRDeviceCheckProviderFactory alloc] init]);
6263
}
6364

6465
DeviceCheckProviderFactoryInternal::~DeviceCheckProviderFactoryInternal() {
@@ -77,7 +78,7 @@ virtual void GetToken(
7778
}
7879
// Otherwise, create a new provider
7980
FIRDeviceCheckProvider* ios_provider =
80-
[ios_provider_factory_ createProviderWithApp:app->GetPlatformApp()];
81+
[ios_provider_factory() createProviderWithApp:app->GetPlatformApp()];
8182
AppCheckProvider* cpp_provider = new internal::DeviceCheckProvider(ios_provider);
8283
created_providers_[app] = cpp_provider;
8384
return cpp_provider;

0 commit comments

Comments
 (0)