{"id":61185,"date":"2024-04-05T10:42:29","date_gmt":"2024-04-05T05:12:29","guid":{"rendered":"https:\/\/www.tothenew.com\/blog\/?p=61185"},"modified":"2024-04-12T11:38:15","modified_gmt":"2024-04-12T06:08:15","slug":"memory-leak-with-memory-graph-debugger","status":"publish","type":"post","link":"https:\/\/www.tothenew.com\/blog\/memory-leak-with-memory-graph-debugger\/","title":{"rendered":"Memory Leak with Memory Graph Debugger"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">Being an iOS developer, We should have excellent understanding about the memory management in iOS applications. So let\u2019s understand what memory leak is and how it impacts user experience and performance of an application.<\/span><\/p>\n<h3><b>What is a Memory Leak?<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">A memory leak can be defined as a reference that is deleted from memory but not released by the owner and that reference can not be released, accessible and also not able to use. A memory leak is a little but serious problem that arises when your application doesn\u2019t release memory that isn\u2019t in use. These leaks can compound over time, resulting in decreased performance, crashes, and a disgruntled user base.<\/span><\/p>\n<h3><b>How does memory management work in Xcode?<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Memory management in Xcode primarily depends on Automatic Reference Counting (ARC), a memory management mechanism used by Swift and Objective-C. Memory allocation and deallocation are automatically performed by ARC by monitoring object references within your code. Let\u2019s understand how ARC works in Xcode.<\/span><\/p>\n<h4><b>ARC Working<\/b><\/h4>\n<p><span style=\"font-weight: 400;\">The abbreviation ARC stands for Automatic Referencing Counting. ARC essentially tracks the lifetime of an object. It works with retain count; whenever any strong object is created, retain count is increased by 1, and when the object&#8217;s life is ended, retain count decreases by 1.<\/span><\/p>\n<h2><b>By Apple:<\/b><\/h2>\n<p><i><span style=\"font-weight: 400;\">Every time you create a new class instance, ARC allocates a chunk of memory to store information about that instance. This memory holds information about the instance type and the values of any stored properties associated with that instance.<\/span><\/i><\/p>\n<p><i><span style=\"font-weight: 400;\">Additionally, when an instance is no longer needed, ARC frees up the memory used by that instance so that the memory can be used for other purposes instead. This ensures that class instances don\u2019t take up space in memory when they\u2019re no longer needed.<\/span><\/i><\/p>\n<h3><b>What is a Memory Graph Debugger?<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">The Memory Graph Debugger is a sophisticated tool included with Xcode. It assists developers in visualizing and analyzing the relationships between objects in memory during the runtime of a Swift or Objective-C application. It displays the number of references of any class that has been created. This tool is especially useful for detecting memory leaks, maintaining cycles, and understanding how memory is managed in your program. Before we begin, let\u2019s review the fundamental setup needed for the memory graph debugger.<\/span><\/p>\n<h3><b>Enable Malloc Stack Logging<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Malloc stack logging is a feature in macOS and iOS development environments that allows developers to capture stack traces of memory allocations and deallocations made by the malloc memory allocation function. It offers extensive information on the call stack during memory allocation and deallocation, which can be extremely useful for identifying memory-related problems including memory leaks, buffer overflows, and use-after-free errors. To enable malloc stack logging in Xcode, set environment variables that collect stack traces for memory allocations and deallocations. Here are the steps.<\/span><\/p>\n<ol>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Open your application in Xcode<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Then click on <\/span><b>Schema -&gt; Edit Scheme<\/b><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Select <\/span><b>Run<\/b><span style=\"font-weight: 400;\"> option in left menu<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Then select <\/span><b>Diagnostics<\/b><span style=\"font-weight: 400;\"> tab\u00a0<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Under <\/span><b>Memory Management<\/b><span style=\"font-weight: 400;\">, Select <\/span><b>Malloc Stack Logging\u00a0<\/b><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">In drop down select <\/span><b>All Allocation and Free History<\/b><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Then close popup<\/span><\/li>\n<\/ol>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-61120 size-large alignnone\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-09-at-1.56.36\u202fPM-1024x285.png\" alt=\"\" width=\"625\" height=\"174\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-09-at-1.56.36\u202fPM-1024x285.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-09-at-1.56.36\u202fPM-300x84.png 300w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-09-at-1.56.36\u202fPM-768x214.png 768w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-09-at-1.56.36\u202fPM-1536x428.png 1536w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-09-at-1.56.36\u202fPM-624x174.png 624w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-09-at-1.56.36\u202fPM.png 1557w\" sizes=\"(max-width: 625px) 100vw, 625px\" \/><\/p>\n<p style=\"text-align: center;\"><span style=\"font-weight: 400;\">Select for Edit Schema<\/span><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-61184 size-large alignnone\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-09-at-1.57.26\u202fPM-1024x554.png\" alt=\"\" width=\"625\" height=\"338\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-09-at-1.57.26\u202fPM-1024x554.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-09-at-1.57.26\u202fPM-300x162.png 300w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-09-at-1.57.26\u202fPM-768x415.png 768w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-09-at-1.57.26\u202fPM-1536x830.png 1536w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-09-at-1.57.26\u202fPM-624x337.png 624w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-09-at-1.57.26\u202fPM.png 1872w\" sizes=\"(max-width: 625px) 100vw, 625px\" \/><\/p>\n<p style=\"text-align: center;\"><span style=\"font-weight: 400;\">Enable Malloc Stack Logging<\/span><\/p>\n<h2><b>Pros and Cons of Memory Stack Logging<\/b><\/h2>\n<p><b>Pros: &#8211;<\/b><\/p>\n<ol>\n<li style=\"font-weight: 400;\"><b>Identifying Memory Leaks: <\/b><span style=\"font-weight: 400;\">Malloc stack logging captures precise information on memory allocations and deallocations, including stack traces.<\/span><\/li>\n<li style=\"font-weight: 400;\"><b>Detecting Overflows and Use-After-Free Errors: <\/b><span style=\"font-weight: 400;\">Malloc stack logging provides detailed stack traces that can assist in identifying buffer overflows and use-after-free issues, which are typical memory-related bugs.<\/span><\/li>\n<li style=\"font-weight: 400;\"><b>Understanding Memory Usage Patterns: <\/b><span style=\"font-weight: 400;\">By using this, you can gain insights into your application&#8217;s memory usage patterns.<\/span><\/li>\n<\/ol>\n<p><b>Cons:\u200a &#8211;<\/b><\/p>\n<ol>\n<li style=\"font-weight: 400;\"><b>Performance Overhead: <\/b><span style=\"font-weight: 400;\">Enabling malloc stack logging may result in some performance overhead, particularly when capturing detailed stack traces for each memory allocation. This burden may influence the performance of your application, particularly in performance-sensitive scenarios.<\/span><\/li>\n<li style=\"font-weight: 400;\"><b>Increased Memory Usage: <\/b><span style=\"font-weight: 400;\">Malloc stack logging uses more memory to keep stack traces for each memory allocation. This can increase your application\u2019s memory footprint, particularly if you enable comprehensive logging.<\/span><\/li>\n<li style=\"font-weight: 400;\"><b>Potential Privacy Concerns: <\/b><span style=\"font-weight: 400;\">Malloc stack logging captures detailed stack traces, which may include sensitive information such as function names and arguments. This information should be handled and stored securely, particularly in production contexts.<\/span><\/li>\n<\/ol>\n<p><span style=\"font-weight: 400;\">As we discussed, here are the pros and cons of <\/span><b>enabling Malloc Stack Logging. <\/b><span style=\"font-weight: 400;\">So, always disable this after debugging the memory leaks by following the steps mentioned above. You just uncheck the Malloc Stack Logging check box. <\/span><\/p>\n<h3><b>How to work with Memory Graph?<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">The memory graph tool is incredibly simple to use and debug leaks. Let\u2019s understand how.<\/span><\/p>\n<p><strong>1.<\/strong> <strong>Opening Memory Graph: <\/strong>Launch your program using the Memory Graph Debugger in Xcode\u2019s debug mode<span style=\"font-weight: 400;\">. While your app runs, navigate to the Debug menu in Xcode and select \u201cDebug Memory Graph.\u201d As given in the image below:<\/span><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-61124 size-large alignnone\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-06-at-11.13.38\u202fPM-1024x662.png\" alt=\"\" width=\"625\" height=\"404\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-06-at-11.13.38\u202fPM-1024x662.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-06-at-11.13.38\u202fPM-300x194.png 300w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-06-at-11.13.38\u202fPM-768x496.png 768w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-06-at-11.13.38\u202fPM-1536x993.png 1536w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-06-at-11.13.38\u202fPM-2048x1324.png 2048w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-06-at-11.13.38\u202fPM-624x403.png 624w\" sizes=\"(max-width: 625px) 100vw, 625px\" \/><\/p>\n<p style=\"text-align: center;\"><span style=\"font-weight: 400;\">Opening Memory Graph<\/span><\/p>\n<p><b>2. Graphical Representation:-<\/b> <span style=\"font-weight: 400;\">As we already discussed, it visually displays the relationship between objects. The Memory Graph Debugger shows Objects in your application as nodes in a graph. Relationships between items are represented as connections or edges between nodes.<\/span><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-61126 size-large\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-06-at-11.22.07\u202fPM-1024x662.png\" alt=\"\" width=\"625\" height=\"404\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-06-at-11.22.07\u202fPM-1024x662.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-06-at-11.22.07\u202fPM-300x194.png 300w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-06-at-11.22.07\u202fPM-768x496.png 768w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-06-at-11.22.07\u202fPM-1536x993.png 1536w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-06-at-11.22.07\u202fPM-2048x1324.png 2048w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-06-at-11.22.07\u202fPM-624x403.png 624w\" sizes=\"(max-width: 625px) 100vw, 625px\" \/><\/p>\n<p style=\"text-align: center;\"><span style=\"font-weight: 400;\">Graphical Representation<\/span><\/p>\n<p><b>3. Navigation and Interaction:-<\/b><span style=\"font-weight: 400;\"> To investigate various aspects of the item relationships, you can pan and zoom in and out of the graph. Clicking on a node displays information about that item, such as its class, characteristics, and relationships.<\/span><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-61127 size-large alignnone\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-06-at-11.23.11\u202fPM-1024x662.png\" alt=\"\" width=\"625\" height=\"404\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-06-at-11.23.11\u202fPM-1024x662.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-06-at-11.23.11\u202fPM-300x194.png 300w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-06-at-11.23.11\u202fPM-768x496.png 768w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-06-at-11.23.11\u202fPM-1536x993.png 1536w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-06-at-11.23.11\u202fPM-2048x1324.png 2048w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-06-at-11.23.11\u202fPM-624x403.png 624w\" sizes=\"(max-width: 625px) 100vw, 625px\" \/><\/p>\n<p style=\"text-align: center;\"><span style=\"font-weight: 400;\">Navigation to an object<\/span><\/p>\n<p><b>4. Reference Count:-<\/b><span style=\"font-weight: 400;\"> The Memory Graph Debugger displays reference counts for each object, allowing developers to understand how many references are kept at any given time. As the program runs, developers may track changes in reference counts in real-time. As we can also verify the above screenshot.<\/span><\/p>\n<p><b>5. Object Details:-<\/b><span style=\"font-weight: 400;\"> When a node is clicked, an inspection panel with comprehensive details about the chosen object is displayed. Developers may inspect the characteristics and relationships of the item, which helps them understand its purpose in the application.<\/span><\/p>\n<p><b>6. Identifying Retain Cycle:-<\/b><span style=\"font-weight: 400;\"> The Memory Graph Debugger can detect possible difficulties, such as retain cycles, which arise when objects refer to each other in a way that restricts automatic deallocation. Developers can identify loops in the graph that indicate possible retain cycles. Let\u2019s understand it by images.<\/span><\/p>\n<p><b>7. Leak Detection:-<\/b><span style=\"font-weight: 400;\"> The Memory Graph Debugger is useful for detecting memory leaks by viewing objects that endure in memory after they should have been deallocated. Developers can follow the relationships between items to determine the primary causes of memory leaks.<\/span><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-61129 size-large\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-07-at-12.09.09\u202fAM-1024x662.png\" alt=\"\" width=\"625\" height=\"404\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-07-at-12.09.09\u202fAM-1024x662.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-07-at-12.09.09\u202fAM-300x194.png 300w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-07-at-12.09.09\u202fAM-768x496.png 768w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-07-at-12.09.09\u202fAM-1536x993.png 1536w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-07-at-12.09.09\u202fAM-2048x1324.png 2048w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-07-at-12.09.09\u202fAM-624x403.png 624w\" sizes=\"(max-width: 625px) 100vw, 625px\" \/><\/p>\n<p style=\"text-align: center;\"><span style=\"font-weight: 400;\">Retain cycle code<\/span><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-61128 size-large\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-07-at-12.08.18\u202fAM-1024x662.png\" alt=\"\" width=\"625\" height=\"404\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-07-at-12.08.18\u202fAM-1024x662.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-07-at-12.08.18\u202fAM-300x194.png 300w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-07-at-12.08.18\u202fAM-768x496.png 768w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-07-at-12.08.18\u202fAM-1536x993.png 1536w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-07-at-12.08.18\u202fAM-2048x1324.png 2048w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-07-at-12.08.18\u202fAM-624x403.png 624w\" sizes=\"(max-width: 625px) 100vw, 625px\" \/><\/p>\n<p style=\"text-align: center;\"><span style=\"font-weight: 400;\">Retain cycle graph<\/span><\/p>\n<p><span style=\"font-weight: 400;\">As shown in the images above, NewViewController contains 7 objects that have not been released because the above code aggressively captured Self. So, when we dismiss NewViewController, it will not be deallocated. Let\u2019s see how we resolve this issue.<\/span><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-61121 size-large\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-07-at-12.16.45\u202fAM-1024x662.png\" alt=\"\" width=\"625\" height=\"404\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-07-at-12.16.45\u202fAM-1024x662.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-07-at-12.16.45\u202fAM-300x194.png 300w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-07-at-12.16.45\u202fAM-768x496.png 768w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-07-at-12.16.45\u202fAM-1536x993.png 1536w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-07-at-12.16.45\u202fAM-2048x1324.png 2048w, \/blog\/wp-ttn-blog\/uploads\/2024\/04\/Screenshot-2024-03-07-at-12.16.45\u202fAM-624x403.png 624w\" sizes=\"(max-width: 625px) 100vw, 625px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">As demonstrated in the screenshot above, we have captured self as weak, and we can also see that when NewViewController is dismissed, it is correctly deinit. So, there is no reference to NewViewController count on the left panel.<\/span><\/p>\n<h3><b>Conclusion<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">The debugging environment in Xcode is smoothly linked with the Memory Graph Debugger. When debugging their code, developers can switch to it to find and fix memory-related problems. To ensure optimal memory management in their applications, developers must comprehend the Memory Graph and know how to use the Memory Graph Debugger. It provides information about how objects behave during runtime, helps locate problems like memory leaks and retain cycles, and is essential for maximizing application performance.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">You can find the example in the repository below-<\/span><a href=\"https:\/\/github.com\/ttnpankajgupta\/MemoryLeakExample\"> <span style=\"font-weight: 400;\">MemoryLeakExample<\/span><\/a><\/p>\n<div class=\"ap-custom-wrapper\"><\/div><!--ap-custom-wrapper-->","protected":false},"excerpt":{"rendered":"<p>Being an iOS developer, We should have excellent understanding about the memory management in iOS applications. So let\u2019s understand what memory leak is and how it impacts user experience and performance of an application. What is a Memory Leak? A memory leak can be defined as a reference that is deleted from memory but not [&hellip;]<\/p>\n","protected":false},"author":1759,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":334},"categories":[1400,1772,1994],"tags":[5804,1163],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/61185"}],"collection":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/users\/1759"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/comments?post=61185"}],"version-history":[{"count":2,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/61185\/revisions"}],"predecessor-version":[{"id":61273,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/61185\/revisions\/61273"}],"wp:attachment":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/media?parent=61185"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/categories?post=61185"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/tags?post=61185"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}