From 5b2859675acf0a704793c289a6a3dc2ee48cc097 Mon Sep 17 00:00:00 2001 From: Alexander Borsuk Date: Thu, 29 Apr 2021 23:38:16 +0200 Subject: [PATCH 1/2] [ios] Fixed observer modification crash Signed-off-by: Alexander Borsuk --- iphone/CoreApi/CoreApi/Storage/MWMStorage.mm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/iphone/CoreApi/CoreApi/Storage/MWMStorage.mm b/iphone/CoreApi/CoreApi/Storage/MWMStorage.mm index 12c58c8400..b5f70bbbf1 100644 --- a/iphone/CoreApi/CoreApi/Storage/MWMStorage.mm +++ b/iphone/CoreApi/CoreApi/Storage/MWMStorage.mm @@ -40,7 +40,10 @@ using namespace storage; GetFramework().GetStorage().Subscribe( [observers](CountryId const & countryId) { - for (id observer in observers) { + // A copy is created, because MWMMapDownloadDialog is unsubscribed inside this notification with + // NSGenericException', reason: '*** Collection was mutated while being enumerated.' + NSHashTable *observersCopy = [observers copy]; + for (id observer in observersCopy) { [observer processCountryEvent:@(countryId.c_str())]; } }, -- 2.45.3 From 8104e48bc322fe6469bc31ed1e6b936a4615b34a Mon Sep 17 00:00:00 2001 From: "Evgeniy A. Dushistov" Date: Fri, 30 Apr 2021 02:26:41 +0300 Subject: [PATCH 2/2] removing strange case size_t -> int to fix compiler warning `segments.size()` has `size_t` type, `i` also has `size_t` type. We inside cycle via `segments`, so `segments.size() > 0`. I can not see any reason to cast size_t to int before comparing. Signed-off-by: Evgeniy A. Dushistov --- drape_frontend/selection_shape_generator.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/drape_frontend/selection_shape_generator.cpp b/drape_frontend/selection_shape_generator.cpp index 4fe68d1756..59d57e4f12 100644 --- a/drape_frontend/selection_shape_generator.cpp +++ b/drape_frontend/selection_shape_generator.cpp @@ -265,12 +265,13 @@ drape_ptr SelectionShapeGenerator::GenerateSelectionGeometry(ref_ptr // Build geometry. std::vector geometry; - geometry.reserve(segments.size() * 24); + size_t const segsCount = segments.size(); + geometry.reserve(segsCount * 24); float length = 0.0f; - for (size_t i = 0; i < segments.size(); ++i) + for (size_t i = 0; i < segsCount; ++i) { UpdateNormals(&segments[i], (i > 0) ? &segments[i - 1] : nullptr, - (i < static_cast(segments.size()) - 1) ? &segments[i + 1] : nullptr); + (i < segsCount - 1) ? &segments[i + 1] : nullptr); // Generate main geometry. m2::PointD const startPt = MapShape::ConvertToLocal(glsl::FromVec2(segments[i].m_points[StartPoint]), @@ -308,7 +309,7 @@ drape_ptr SelectionShapeGenerator::GenerateSelectionGeometry(ref_ptr geometry.emplace_back(endPivot, glsl::vec2(0, 0), colorCoord, glsl::vec3(length, 0, kCenter)); // Generate joins. - if (segments[i].m_generateJoin && i < static_cast(segments.size()) - 1) + if (segments[i].m_generateJoin && i < segsCount - 1) { glsl::vec2 const n1 = segments[i].m_hasLeftJoin[EndPoint] ? segments[i].m_leftNormals[EndPoint] : segments[i].m_rightNormals[EndPoint]; @@ -339,7 +340,7 @@ drape_ptr SelectionShapeGenerator::GenerateSelectionGeometry(ref_ptr true, geometry); } - if (i == static_cast(segments.size()) - 1) + if (i == segsCount - 1) { std::vector normals; normals.reserve(24); -- 2.45.3