diff --git a/shell/platform/darwin/common/buffer_conversions.h b/shell/platform/darwin/common/buffer_conversions.h index 7dd90f558d6cb..819eddcae8017 100644 --- a/shell/platform/darwin/common/buffer_conversions.h +++ b/shell/platform/darwin/common/buffer_conversions.h @@ -15,9 +15,9 @@ namespace flutter { fml::MallocMapping CopyNSDataToMapping(NSData* data); -NSData* CopyMappingToNSData(fml::MallocMapping buffer); +NSData* ConvertMappingToNSData(fml::MallocMapping buffer); -std::unique_ptr CopyNSDataToMappingPtr(NSData* data); +std::unique_ptr ConvertNSDataToMappingPtr(NSData* data); NSData* CopyMappingPtrToNSData(std::unique_ptr mapping); diff --git a/shell/platform/darwin/common/buffer_conversions.mm b/shell/platform/darwin/common/buffer_conversions.mm index 1856ec0761151..c0c5e43469f34 100644 --- a/shell/platform/darwin/common/buffer_conversions.mm +++ b/shell/platform/darwin/common/buffer_conversions.mm @@ -4,20 +4,38 @@ #import "flutter/shell/platform/darwin/common/buffer_conversions.h" +#include "flutter/fml/platform/darwin/scoped_nsobject.h" + namespace flutter { +namespace { +class NSDataMapping : public fml::Mapping { + public: + NSDataMapping(NSData* data) : data_([data retain]) {} + + size_t GetSize() const override { return [data_.get() length]; } + + const uint8_t* GetMapping() const override { + return static_cast([data_.get() bytes]); + } + + private: + fml::scoped_nsobject data_; + FML_DISALLOW_COPY_AND_ASSIGN(NSDataMapping); +}; +} // namespace fml::MallocMapping CopyNSDataToMapping(NSData* data) { const uint8_t* bytes = static_cast(data.bytes); return fml::MallocMapping::Copy(bytes, data.length); } -NSData* CopyMappingToNSData(fml::MallocMapping buffer) { - return [NSData dataWithBytes:const_cast(buffer.GetMapping()) length:buffer.GetSize()]; +NSData* ConvertMappingToNSData(fml::MallocMapping buffer) { + size_t size = buffer.GetSize(); + return [NSData dataWithBytesNoCopy:buffer.Release() length:size]; } -std::unique_ptr CopyNSDataToMappingPtr(NSData* data) { - auto mapping = CopyNSDataToMapping(data); - return std::make_unique(std::move(mapping)); +std::unique_ptr ConvertNSDataToMappingPtr(NSData* data) { + return std::make_unique(data); } NSData* CopyMappingPtrToNSData(std::unique_ptr mapping) { diff --git a/shell/platform/darwin/ios/framework/Source/platform_message_router.mm b/shell/platform/darwin/ios/framework/Source/platform_message_router.mm index db8b53afa4125..841d54627e8df 100644 --- a/shell/platform/darwin/ios/framework/Source/platform_message_router.mm +++ b/shell/platform/darwin/ios/framework/Source/platform_message_router.mm @@ -22,12 +22,12 @@ FlutterBinaryMessageHandler handler = it->second; NSData* data = nil; if (message->hasData()) { - data = CopyMappingToNSData(message->releaseData()); + data = ConvertMappingToNSData(message->releaseData()); } handler(data, ^(NSData* reply) { if (completer) { if (reply) { - completer->Complete(CopyNSDataToMappingPtr(reply)); + completer->Complete(ConvertNSDataToMappingPtr(reply)); } else { completer->CompleteEmpty(); }