{"id":6412,"date":"2020-11-20T11:46:19","date_gmt":"2020-11-20T06:16:19","guid":{"rendered":"https:\/\/www.innovationm.com\/blog\/?p=6412"},"modified":"2020-11-20T11:46:19","modified_gmt":"2020-11-20T06:16:19","slug":"swift-memory-safety","status":"publish","type":"post","link":"https:\/\/www.innovationm.com\/blog\/swift-memory-safety\/","title":{"rendered":"Swift Memory Safety"},"content":{"rendered":"<p>&nbsp;<\/p>\n<p><b>Memory Safety in Swift<\/b><span style=\"font-weight: 400;\">\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Swift monitors risky behaviour that may occur in the code. For example, Swift ensures that variables are introduced before they&#8217;re utilized, likewise, memory isn&#8217;t accessed once its deallocated, and array indices are checked for out-of-bounds errors.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Swift additionally guarantees that multiple access to a similar region of memory doesn&#8217;t conflict, by requiring code that alters a location in memory to have restrictive access to that memory. Since Swift manages memory naturally, more often than not you don&#8217;t need to consider getting to memory by any means. However, it&#8217;s essential to understand where potential clashes can happen, so you can avoid composing code that has clashing access to memory. If your code contains clashes, you\u2019ll get a compile-time or runtime error.<\/span><span style=\"font-weight: 400;\">\u00a0<\/span><\/p>\n<p><b>Understanding Conflicting Access to Memory\u00a0<\/b><span style=\"font-weight: 400;\">\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Memory access occurs in your code when you do things like set the value of a variable or pass an argument to a function. For instance, the following code contains both read access and write access:\u00a0<\/span><span style=\"font-weight: 400;\">\u00a0<\/span><\/p>\n<pre class=\"lang:default decode:true \">var one = 1\r\n\r\n\/\/ A read access from the memory where one is stored.\r\n\r\nprint(\"We're number \\(one)!\")<\/pre>\n<p><span style=\"font-weight: 400;\">Clashing access to memory can happen when various parts of your code are attempting to get to a similar area in memory simultaneously. Various accesses to a location in memory simultaneously can deliver unusual or conflicting conduct. In Swift, there are approaches to alter a value that spans several lines of code, making it possible to access a value in the middle of its modification.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">You can see a comparable issue by thinking about how you update spending that is composed of a piece of paper. Updating the spending plan is a two-step measure: First, you add the things&#8217; names and costs, and afterwards, you change the aggregate sum to reflect the items currently on the list. Before and after the update, you can read any information from the budget and get a correct answer, as shown in the figure below.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">While you&#8217;re adding items to the spending plan, it&#8217;s in a temporary, invalid state because the aggregate sum hasn&#8217;t been refreshed to reflect the recently added items. Perusing the aggregate sum during the way toward adding a thing gives you mistaken data.\u00a0<\/span><span style=\"font-weight: 400;\">\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">This example additionally shows a challenge you may experience when fixing clashing access to memory: There are at times numerous approaches to fix the contention that produce various answers, and it&#8217;s not generally evident which answer is right. In this example, depending upon whether you need the first aggregate sum or the refreshed aggregate sum, either $5 or $320 could be the right answer. Before you can fix the clashing access, you need to figure out what it was planned to do.\u00a0<\/span><span style=\"font-weight: 400;\">\u00a0<\/span><\/p>\n<p><b>Characteristics of Memory Access<\/b><span style=\"font-weight: 400;\">\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">There are three characteristics of memory access to consider with regards to clashing access: regardless of whether the access is a read or a write, the duration of the access, and the location in memory being accessed. In particular, a contention happens on the off chance that you have two accesses that meet the following conditions:<\/span><span style=\"font-weight: 400;\">\u00a0<\/span><\/p>\n<ol>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">At least one is written access.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">\u00a0They access the same location in memory.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">\u00a0Their durations overlap. <\/span><\/li>\n<\/ol>\n<p><span style=\"font-weight: 400;\">The distinction between a read and write access is normally self-evident: write access changes the area in memory, yet read access doesn&#8217;t. The area in memory refers to what exactly is being accessed \u2014for instance, a variable, consistent, or property. The span of memory access is either immediate or long haul.\u00a0<\/span><span style=\"font-weight: 400;\">\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Access is immediate if it&#8217;s not possible for another code to run that entrance begins however before it closes. By their tendency, two momentary gets can&#8217;t occur simultaneously. Most memory access is quick. For instance, all the read and write the instance in the code listing below are instantaneous:<\/span><\/p>\n<pre class=\"lang:default decode:true \">func oneMore(than number: Int) -&gt; Int {\r\n\r\n\u00a0\u00a0\u00a0\u00a0return number + 1\r\n\r\n}\u00a0\r\n\r\nvar myNumber = 1\r\n\r\nmyNumber = oneMore(than: myNumber)\r\n\r\nprint(myNumber)\r\n\r\n\/\/ Prints \"2\u201d<\/pre>\n<p><span style=\"font-weight: 400;\">However, there are a few different ways to get to memory, called long term access, that length the execution of other code. The difference between prompt access and long-term access is that it&#8217;s workable for other code to pursue drawn-out access begins however before it closes, which is called the cover. Drawn-out access can cover with other long-term access and quickly get to. <\/span><span style=\"font-weight: 400;\">\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Overlapping accesses appear primarily in code that uses in-out parameters in functions and methods or mutating methods of a structure. The specific kinds of Swift code that use long-term accesses are discussed in the sections below.<\/span><span style=\"font-weight: 400;\">\u00a0<\/span><\/p>\n<p><b>Clashing Access to In-Out Parameters\u00a0<\/b><span style=\"font-weight: 400;\">\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">A function has long term write access to the entirety of its in-out parameters. The write access for an in-out parameter begins after the entirety of the non-in-out parameters have been assessed and goes on for the whole length of that function call. On the off chance that there are numerous in-out boundaries, the compose gets to begin as per the pattern in which the boundaries show up.\u00a0<\/span><span style=\"font-weight: 400;\">\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">One outcome of this long term writ write access is that you can&#8217;t get to the first variable that was passed as in-out, regardless of whether checking rules and access control would somehow allow it\u2014any admittance to the first makes a conflict. For example:\u00a0<\/span><span style=\"font-weight: 400;\">\u00a0<\/span><\/p>\n<pre class=\"lang:default decode:true \">var stepSize = 1\u00a0\r\n\r\nfunc increment(_ number: inout Int) {\u00a0\r\n\r\nnumber += stepSize\u00a0\u00a0\r\n\r\n}\u00a0\r\n\r\nincrement(&amp;stepSize)\u00a0\r\n\r\n\/\/Error: clashing gets to stepSize\"<\/pre>\n<p><span style=\"font-weight: 400;\">In the code above, stepSize is a global variable, and it is typically open from inside increment(_:). Be that as it may, the read admittance to stepSize covers with the compose admittance to number. One approach to illuminate this contention is to make an express duplicate of stepSize:&#8221;\u00a0<\/span><span style=\"font-weight: 400;\">\u00a0<\/span><\/p>\n<pre class=\"lang:default decode:true \">\/\/ Make an explicit copy.\r\n\r\nvar copyOfStepSize = stepSize\r\n\r\nincrement(&amp;copyOfStepSize)\u00a0\r\n\r\n\/\/ Update the original.\r\n\r\nstepSize = copyOfStepSize\r\n\r\n\/\/ stepSize is now 2<\/pre>\n<p><span style=\"font-weight: 400;\">At the point when you duplicate stepSize prior to calling increment(_:), unmistakably the estimation of copyOfStepSize is increased by the current advance size. The read access closes before the write access begins, so there isn&#8217;t a convention. <\/span><span style=\"font-weight: 400;\">\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Another outcome of long haul compose admittance to in-out parameters is that passing a solitary variable as the argument for various in-out parameters of a similar function creates a contention. For instance:<\/span><span style=\"font-weight: 400;\">\u00a0<\/span><span style=\"font-weight: 400;\">\u00a0<\/span><\/p>\n<pre class=\"lang:default decode:true \">func balance(_ x: inout Int, _ y: inout Int) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0let sum = x + y\r\n\r\n\u00a0\u00a0\u00a0\u00a0x = sum \/ 2\r\n\r\n\u00a0\u00a0\u00a0\u00a0y = sum - x\r\n\r\n}\r\n\r\nvar playerOneScore = 42\r\n\r\nvar playerTwoScore = 30\r\n\r\nbalance(&amp;playerOneScore, &amp;playerTwoScore)\u00a0 \/\/ OK\r\n\r\nbalance(&amp;playerOneScore, &amp;playerOneScore)\r\n\r\n\/\/ Error: conflicting accesses to playerOneScore<\/pre>\n<p><span style=\"font-weight: 400;\">The balance(_:_:) function above adjusts its two parameters to separate the all-out worth uniformly between them. Calling it with playerOneScore and playerTwoScore as contentions doesn&#8217;t create a contention\u2014there are two write access to that cover as expected, however, they access various areas in memory. Interestingly, passing playerOneScore as the incentive for the two parameters creates a contention since it attempts to perform two write access to a similar area in memory simultaneously.&#8221;<\/span><span style=\"font-weight: 400;\">\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u00a0<\/span><\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>&nbsp; Memory Safety in Swift\u00a0 Swift monitors risky behaviour that may occur in the code. For example, Swift ensures that variables are introduced before they&#8217;re utilized, likewise, memory isn&#8217;t accessed once its deallocated, and array indices are checked for out-of-bounds errors. Swift additionally guarantees that multiple access to a similar region of memory doesn&#8217;t conflict, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":6413,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[14,555],"class_list":["post-6412","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ios","tag-innovationm","tag-swiftmemorysafety"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Swift Memory Safety - InnovationM - Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.innovationm.com\/blog\/swift-memory-safety\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Swift Memory Safety - InnovationM - Blog\" \/>\n<meta property=\"og:description\" content=\"&nbsp; Memory Safety in Swift\u00a0 Swift monitors risky behaviour that may occur in the code. For example, Swift ensures that variables are introduced before they&#8217;re utilized, likewise, memory isn&#8217;t accessed once its deallocated, and array indices are checked for out-of-bounds errors. Swift additionally guarantees that multiple access to a similar region of memory doesn&#8217;t conflict, [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.innovationm.com\/blog\/swift-memory-safety\/\" \/>\n<meta property=\"og:site_name\" content=\"InnovationM - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-11-20T06:16:19+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/11\/SwiftMemorySafety.png\" \/>\n\t<meta property=\"og:image:width\" content=\"960\" \/>\n\t<meta property=\"og:image:height\" content=\"540\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"InnovationM Admin\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"InnovationM Admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/swift-memory-safety\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/swift-memory-safety\\\/\"},\"author\":{\"name\":\"InnovationM Admin\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\"},\"headline\":\"Swift Memory Safety\",\"datePublished\":\"2020-11-20T06:16:19+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/swift-memory-safety\\\/\"},\"wordCount\":1033,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/swift-memory-safety\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/11\\\/SwiftMemorySafety.png\",\"keywords\":[\"InnovationM\",\"SwiftMemorySafety\"],\"articleSection\":[\"iOS\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/swift-memory-safety\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/swift-memory-safety\\\/\",\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/swift-memory-safety\\\/\",\"name\":\"Swift Memory Safety - InnovationM - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/swift-memory-safety\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/swift-memory-safety\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/11\\\/SwiftMemorySafety.png\",\"datePublished\":\"2020-11-20T06:16:19+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/swift-memory-safety\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/swift-memory-safety\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/swift-memory-safety\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/11\\\/SwiftMemorySafety.png\",\"contentUrl\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/11\\\/SwiftMemorySafety.png\",\"width\":960,\"height\":540},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/swift-memory-safety\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Swift Memory Safety\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/\",\"name\":\"InnovationM - Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/#\\\/schema\\\/person\\\/a831bf4602d69d1fa452e3de0c8862ed\",\"name\":\"InnovationM Admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g\",\"caption\":\"InnovationM Admin\"},\"sameAs\":[\"http:\\\/\\\/www.innovationm.com\\\/\"],\"url\":\"https:\\\/\\\/www.innovationm.com\\\/blog\\\/author\\\/innovationmadmin\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Swift Memory Safety - InnovationM - Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.innovationm.com\/blog\/swift-memory-safety\/","og_locale":"en_US","og_type":"article","og_title":"Swift Memory Safety - InnovationM - Blog","og_description":"&nbsp; Memory Safety in Swift\u00a0 Swift monitors risky behaviour that may occur in the code. For example, Swift ensures that variables are introduced before they&#8217;re utilized, likewise, memory isn&#8217;t accessed once its deallocated, and array indices are checked for out-of-bounds errors. Swift additionally guarantees that multiple access to a similar region of memory doesn&#8217;t conflict, [&hellip;]","og_url":"https:\/\/www.innovationm.com\/blog\/swift-memory-safety\/","og_site_name":"InnovationM - Blog","article_published_time":"2020-11-20T06:16:19+00:00","og_image":[{"width":960,"height":540,"url":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/11\/SwiftMemorySafety.png","type":"image\/png"}],"author":"InnovationM Admin","twitter_misc":{"Written by":"InnovationM Admin","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.innovationm.com\/blog\/swift-memory-safety\/#article","isPartOf":{"@id":"https:\/\/www.innovationm.com\/blog\/swift-memory-safety\/"},"author":{"name":"InnovationM Admin","@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed"},"headline":"Swift Memory Safety","datePublished":"2020-11-20T06:16:19+00:00","mainEntityOfPage":{"@id":"https:\/\/www.innovationm.com\/blog\/swift-memory-safety\/"},"wordCount":1033,"commentCount":0,"image":{"@id":"https:\/\/www.innovationm.com\/blog\/swift-memory-safety\/#primaryimage"},"thumbnailUrl":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/11\/SwiftMemorySafety.png","keywords":["InnovationM","SwiftMemorySafety"],"articleSection":["iOS"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.innovationm.com\/blog\/swift-memory-safety\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.innovationm.com\/blog\/swift-memory-safety\/","url":"https:\/\/www.innovationm.com\/blog\/swift-memory-safety\/","name":"Swift Memory Safety - InnovationM - Blog","isPartOf":{"@id":"https:\/\/www.innovationm.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.innovationm.com\/blog\/swift-memory-safety\/#primaryimage"},"image":{"@id":"https:\/\/www.innovationm.com\/blog\/swift-memory-safety\/#primaryimage"},"thumbnailUrl":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/11\/SwiftMemorySafety.png","datePublished":"2020-11-20T06:16:19+00:00","author":{"@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed"},"breadcrumb":{"@id":"https:\/\/www.innovationm.com\/blog\/swift-memory-safety\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.innovationm.com\/blog\/swift-memory-safety\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.innovationm.com\/blog\/swift-memory-safety\/#primaryimage","url":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/11\/SwiftMemorySafety.png","contentUrl":"https:\/\/www.innovationm.com\/blog\/wp-content\/uploads\/2020\/11\/SwiftMemorySafety.png","width":960,"height":540},{"@type":"BreadcrumbList","@id":"https:\/\/www.innovationm.com\/blog\/swift-memory-safety\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.innovationm.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Swift Memory Safety"}]},{"@type":"WebSite","@id":"https:\/\/www.innovationm.com\/blog\/#website","url":"https:\/\/www.innovationm.com\/blog\/","name":"InnovationM - Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.innovationm.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.innovationm.com\/blog\/#\/schema\/person\/a831bf4602d69d1fa452e3de0c8862ed","name":"InnovationM Admin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5c99d9eece9dfbc82297cf34ddd58e9fe05bb52fe66c8f6bf6c0a45bfb6d7629?s=96&r=g","caption":"InnovationM Admin"},"sameAs":["http:\/\/www.innovationm.com\/"],"url":"https:\/\/www.innovationm.com\/blog\/author\/innovationmadmin\/"}]}},"_links":{"self":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts\/6412","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/comments?post=6412"}],"version-history":[{"count":0,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/posts\/6412\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/media\/6413"}],"wp:attachment":[{"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/media?parent=6412"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/categories?post=6412"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.innovationm.com\/blog\/wp-json\/wp\/v2\/tags?post=6412"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}