├── .circleci └── config.yml ├── .gitignore ├── .ruby-version ├── CHANGELOG.md ├── Gemfile ├── Gemfile.lock ├── Intercom_logo-github.png ├── LICENSE ├── README.md ├── cocoapods-mangle.gemspec ├── lib ├── cocoapods_mangle.rb ├── cocoapods_mangle │ ├── builder.rb │ ├── config.rb │ ├── context.rb │ ├── defines.rb │ ├── gem_version.rb │ ├── hooks.rb │ └── post_install.rb └── cocoapods_plugin.rb └── spec ├── fixtures ├── objc-pod │ ├── ManglePod.podspec │ └── Source │ │ ├── CPMObject+CPMCategory.h │ │ ├── CPMObject+CPMCategory.m │ │ ├── CPMObject.h │ │ ├── CPMObject.m │ │ ├── NSString+CPMCategory.h │ │ └── NSString+CPMCategory.m ├── project │ ├── Mangle Integration.xcodeproj │ │ ├── project.pbxproj │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ └── Mangle Integration.xcscheme │ └── Mangle Integration │ │ ├── AppDelegate.h │ │ ├── AppDelegate.m │ │ ├── Assets.xcassets │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ │ ├── Dummy.swift │ │ ├── Info.plist │ │ ├── Launch.storyboard │ │ ├── ViewController.h │ │ ├── ViewController.m │ │ └── main.m ├── swift-pod │ ├── ManglePod.podspec │ └── Source │ │ ├── SomeClass.swift │ │ ├── SomeFoundationClass.swift │ │ ├── SomeFunc.swift │ │ └── SomeStruct.swift └── symbols │ ├── all_defined_symbols.txt │ └── non_global_defined_symbols.txt ├── integration └── integration_spec.rb ├── spec_helper.rb └── unit ├── builder_spec.rb ├── config_spec.rb ├── context_spec.rb ├── defines_spec.rb ├── hooks_spec.rb └── post_install_spec.rb /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | jobs: 3 | build: 4 | macos: 5 | xcode: 16.0.0 6 | resource_class: macos.m1.medium.gen1 7 | shell: /bin/bash --login -eo pipefail 8 | steps: 9 | - checkout 10 | - restore_cache: 11 | keys: 12 | - macos-dependencies-{{ checksum "Gemfile.lock" }}-{{ checksum ".circleci/config.yml" }} 13 | - macos-dependencies-{{ checksum "Gemfile.lock" }} 14 | - macos-dependencies- 15 | - run: 16 | name: install dependencies 17 | command: | 18 | bundle install --jobs=4 --retry=3 --path vendor/bundle 19 | - save_cache: 20 | paths: 21 | - ./vendor/bundle 22 | key: macos-dependencies-{{ checksum "Gemfile.lock" }}-{{ checksum ".circleci/config.yml" }} 23 | - run: 24 | name: run tests 25 | command: | 26 | mkdir /tmp/test-results 27 | bundle exec rspec --format RspecJunitFormatter \ 28 | --out /tmp/test-results/rspec.xml \ 29 | --format progress \ 30 | spec/ 31 | - store_test_results: 32 | path: /tmp/test-results 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | pkg 3 | .idea/ 4 | .Trashes 5 | *~.nib 6 | .bundle/ 7 | DerivedData/ 8 | build/ 9 | xcuserdata/ 10 | .bundle/ 11 | .idea/ 12 | *.xcworkspace 13 | *.xccheckout 14 | xcschememanagement.plist 15 | .irb-history 16 | Pods/ 17 | *.xcworkspacedata 18 | -------------------------------------------------------------------------------- /.ruby-version: -------------------------------------------------------------------------------- 1 | 3.3.4 -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # cocoapods-mangle changelog 2 | 3 | ## 1.0.1 (2019-04-08) 4 | 5 | * Update to support Xcode 10.2 6 | 7 | ## 1.0.0 (2017-12-08) 8 | 9 | * Initial release of cocoapods-mangle with support for mangling source Objective C dependencies. 10 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | gemspec 4 | 5 | group :development do 6 | gem 'rspec' 7 | gem 'pry' 8 | gem 'pry-remote' 9 | gem 'rspec_junit_formatter' 10 | gem 'activesupport', '7.0.8' 11 | end 12 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | PATH 2 | remote: . 3 | specs: 4 | cocoapods-mangle (1.1.6) 5 | cocoapods (~> 1.15) 6 | 7 | GEM 8 | remote: https://rubygems.org/ 9 | specs: 10 | CFPropertyList (3.0.7) 11 | base64 12 | nkf 13 | rexml 14 | activesupport (7.0.8) 15 | concurrent-ruby (~> 1.0, >= 1.0.2) 16 | i18n (>= 1.6, < 2) 17 | minitest (>= 5.1) 18 | tzinfo (~> 2.0) 19 | addressable (2.8.7) 20 | public_suffix (>= 2.0.2, < 7.0) 21 | algoliasearch (1.27.5) 22 | httpclient (~> 2.8, >= 2.8.3) 23 | json (>= 1.5.1) 24 | atomos (0.1.3) 25 | base64 (0.2.0) 26 | claide (1.1.0) 27 | cocoapods (1.16.2) 28 | addressable (~> 2.8) 29 | claide (>= 1.0.2, < 2.0) 30 | cocoapods-core (= 1.16.2) 31 | cocoapods-deintegrate (>= 1.0.3, < 2.0) 32 | cocoapods-downloader (>= 2.1, < 3.0) 33 | cocoapods-plugins (>= 1.0.0, < 2.0) 34 | cocoapods-search (>= 1.0.0, < 2.0) 35 | cocoapods-trunk (>= 1.6.0, < 2.0) 36 | cocoapods-try (>= 1.1.0, < 2.0) 37 | colored2 (~> 3.1) 38 | escape (~> 0.0.4) 39 | fourflusher (>= 2.3.0, < 3.0) 40 | gh_inspector (~> 1.0) 41 | molinillo (~> 0.8.0) 42 | nap (~> 1.0) 43 | ruby-macho (>= 2.3.0, < 3.0) 44 | xcodeproj (>= 1.27.0, < 2.0) 45 | cocoapods-core (1.16.2) 46 | activesupport (>= 5.0, < 8) 47 | addressable (~> 2.8) 48 | algoliasearch (~> 1.0) 49 | concurrent-ruby (~> 1.1) 50 | fuzzy_match (~> 2.0.4) 51 | nap (~> 1.0) 52 | netrc (~> 0.11) 53 | public_suffix (~> 4.0) 54 | typhoeus (~> 1.0) 55 | cocoapods-deintegrate (1.0.5) 56 | cocoapods-downloader (2.1) 57 | cocoapods-plugins (1.0.0) 58 | nap 59 | cocoapods-search (1.0.1) 60 | cocoapods-trunk (1.6.0) 61 | nap (>= 0.8, < 2.0) 62 | netrc (~> 0.11) 63 | cocoapods-try (1.2.0) 64 | coderay (1.1.3) 65 | colored2 (3.1.2) 66 | concurrent-ruby (1.2.3) 67 | diff-lcs (1.5.1) 68 | escape (0.0.4) 69 | ethon (0.16.0) 70 | ffi (>= 1.15.0) 71 | ffi (1.17.1) 72 | fourflusher (2.3.1) 73 | fuzzy_match (2.0.4) 74 | gh_inspector (1.1.3) 75 | httpclient (2.9.0) 76 | mutex_m 77 | i18n (1.14.1) 78 | concurrent-ruby (~> 1.0) 79 | json (2.10.2) 80 | method_source (1.0.0) 81 | minitest (5.22.2) 82 | molinillo (0.8.0) 83 | mutex_m (0.3.0) 84 | nanaimo (0.4.0) 85 | nap (1.1.0) 86 | netrc (0.11.0) 87 | nkf (0.2.0) 88 | pry (0.14.2) 89 | coderay (~> 1.1) 90 | method_source (~> 1.0) 91 | pry-remote (0.1.8) 92 | pry (~> 0.9) 93 | slop (~> 3.0) 94 | public_suffix (4.0.7) 95 | rexml (3.4.1) 96 | rspec (3.13.0) 97 | rspec-core (~> 3.13.0) 98 | rspec-expectations (~> 3.13.0) 99 | rspec-mocks (~> 3.13.0) 100 | rspec-core (3.13.0) 101 | rspec-support (~> 3.13.0) 102 | rspec-expectations (3.13.0) 103 | diff-lcs (>= 1.2.0, < 2.0) 104 | rspec-support (~> 3.13.0) 105 | rspec-mocks (3.13.0) 106 | diff-lcs (>= 1.2.0, < 2.0) 107 | rspec-support (~> 3.13.0) 108 | rspec-support (3.13.0) 109 | rspec_junit_formatter (0.6.0) 110 | rspec-core (>= 2, < 4, != 2.12.0) 111 | ruby-macho (2.5.1) 112 | slop (3.6.0) 113 | typhoeus (1.4.1) 114 | ethon (>= 0.9.0) 115 | tzinfo (2.0.6) 116 | concurrent-ruby (~> 1.0) 117 | xcodeproj (1.27.0) 118 | CFPropertyList (>= 2.3.3, < 4.0) 119 | atomos (~> 0.1.3) 120 | claide (>= 1.0.2, < 2.0) 121 | colored2 (~> 3.1) 122 | nanaimo (~> 0.4.0) 123 | rexml (>= 3.3.6, < 4.0) 124 | 125 | PLATFORMS 126 | ruby 127 | 128 | DEPENDENCIES 129 | activesupport (= 7.0.8) 130 | cocoapods-mangle! 131 | pry 132 | pry-remote 133 | rspec 134 | rspec_junit_formatter 135 | 136 | BUNDLED WITH 137 | 2.1.4 138 | -------------------------------------------------------------------------------- /Intercom_logo-github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/intercom/cocoapods-mangle/a7789d1ef98580a70fd81a4e280b5c92af782280/Intercom_logo-github.png -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright 2017 Intercom, Inc. 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Intercom](Intercom_logo-github.png) 2 | 3 | [![Apache License](http://img.shields.io/badge/license-APACHE2-blue.svg?style=flat)](https://www.apache.org/licenses/LICENSE-2.0.html) 4 | [![CircleCI](https://circleci.com/gh/intercom/cocoapods-mangle.svg?style=svg)](https://circleci.com/gh/intercom/cocoapods-mangle) 5 | 6 | # cocoapods-mangle 7 | 8 | cocoapods-mangle is a CocoaPods plugin which mangles the symbols of your dependencies. Mangling your dependencies' symbols allows more than one copy of a dependency to exist in an app. This is particularly useful for iOS frameworks which do not want to interfere with the host app. 9 | 10 | ## Installation 11 | 12 | $ gem install cocoapods-mangle 13 | 14 | ## What is mangling? 15 | 16 | Mangling or namespacing your dependencies is a way of ensuring that there are no conflicts between multiple copies of the same dependency in an app. This is most useful when developing third-party frameworks. 17 | 18 | For example, if you are developing a framework `MyFramework.framework` and you include `AFNetworking` as a dependency, all `AFNetworking` classes are included in your framework's binary: 19 | 20 | ``` 21 | ➜ nm -gU MyFramework.framework/MyFramework | grep "_OBJC_CLASS_\$.*AF.*" 22 | 00000000000000e0 S _OBJC_CLASS_$_PodsDummy_AFNetworking 23 | 00000000000013f0 S _OBJC_CLASS_$_AFNetworkReachabilityManager 24 | 0000000000001f20 S _OBJC_CLASS_$_AFSecurityPolicy 25 | 000000000000a938 S _OBJC_CLASS_$_AFHTTPBodyPart 26 | 000000000000a898 S _OBJC_CLASS_$_AFHTTPRequestSerializer 27 | 000000000000a9d8 S _OBJC_CLASS_$_AFJSONRequestSerializer 28 | 000000000000a910 S _OBJC_CLASS_$_AFMultipartBodyStream 29 | 000000000000aa28 S _OBJC_CLASS_$_AFPropertyListRequestSerializer 30 | 000000000000a848 S _OBJC_CLASS_$_AFQueryStringPair 31 | 000000000000a8c0 S _OBJC_CLASS_$_AFStreamingMultipartFormData 32 | 0000000000004870 S _OBJC_CLASS_$_AFCompoundResponseSerializer 33 | 00000000000046e0 S _OBJC_CLASS_$_AFHTTPResponseSerializer 34 | 0000000000004820 S _OBJC_CLASS_$_AFImageResponseSerializer 35 | 0000000000004730 S _OBJC_CLASS_$_AFJSONResponseSerializer 36 | 00000000000047d0 S _OBJC_CLASS_$_AFPropertyListResponseSerializer 37 | 0000000000004780 S _OBJC_CLASS_$_AFXMLParserResponseSerializer 38 | ``` 39 | 40 | This means that if an app includes both `MyFramework.framework` and `AFNetworking`, the app will fail to build with an error that looks something like: 41 | 42 | ``` 43 | ld: 16 duplicate symbols for architecture x86_64 44 | clang: error: linker command failed with exit code 1 (use -v to see invocation) 45 | ``` 46 | 47 | However, with mangling enabled through cocoapods-mangle, we can see that the `AFNetworking` classes are now prefixed with `MyFramework_`: 48 | 49 | ``` 50 | ➜ nm -gU MyFramework.framework/MyFramework | grep "_OBJC_CLASS_\$.*AF.*" 51 | 00000000000000e0 S _OBJC_CLASS_$_MyFramework_PodsDummy_AFNetworking 52 | 00000000000013f0 S _OBJC_CLASS_$_MyFramework_AFNetworkReachabilityManager 53 | 0000000000001f20 S _OBJC_CLASS_$_MyFramework_AFSecurityPolicy 54 | 000000000000a938 S _OBJC_CLASS_$_MyFramework_AFHTTPBodyPart 55 | 000000000000a898 S _OBJC_CLASS_$_MyFramework_AFHTTPRequestSerializer 56 | 000000000000a9d8 S _OBJC_CLASS_$_MyFramework_AFJSONRequestSerializer 57 | 000000000000a910 S _OBJC_CLASS_$_MyFramework_AFMultipartBodyStream 58 | 000000000000aa28 S _OBJC_CLASS_$_MyFramework_AFPropertyListRequestSerializer 59 | 000000000000a848 S _OBJC_CLASS_$_MyFramework_AFQueryStringPair 60 | 000000000000a8c0 S _OBJC_CLASS_$_MyFramework_AFStreamingMultipartFormData 61 | 0000000000004870 S _OBJC_CLASS_$_MyFramework_AFCompoundResponseSerializer 62 | 00000000000046e0 S _OBJC_CLASS_$_MyFramework_AFHTTPResponseSerializer 63 | 0000000000004820 S _OBJC_CLASS_$_MyFramework_AFImageResponseSerializer 64 | 0000000000004730 S _OBJC_CLASS_$_MyFramework_AFJSONResponseSerializer 65 | 00000000000047d0 S _OBJC_CLASS_$_MyFramework_AFPropertyListResponseSerializer 66 | 0000000000004780 S _OBJC_CLASS_$_MyFramework_AFXMLParserResponseSerializer 67 | ``` 68 | 69 | The app that includes both `MyFramework.framework` and `AFNetworking` will now build successfully 🎉 70 | 71 | ## How it works 72 | 73 | As demonstrated above, `nm` can be used to inspect the symbols such as classes, constants and selectors in a Mach-O binary. When you run `pod install`, cocoapods-mangle builds your dependencies if they have changed, and parses the output of `nm`. It places this output in an `xcconfig` file that looks something like this: 74 | 75 | ``` 76 | MANGLING_DEFINES = PodsDummy_AFNetworking=MyFramework_PodsDummy_AFNetworking AFNetworkReachabilityManager=MyFramework_AFNetworkReachabilityManager AFSecurityPolicy=MyFramework_AFSecurityPolicy AFHTTPBodyPart=MyFramework_AFHTTPBodyPart AFHTTPRequestSerializer=MyFramework_AFHTTPRequestSerializer AFJSONRequestSerializer=MyFramework_AFJSONRequestSerializer AFMultipartBodyStream=MyFramework_AFMultipartBodyStream AFPropertyListRequestSerializer=MyFramework_AFPropertyListRequestSerializer AFQueryStringPair=MyFramework_AFQueryStringPair AFStreamingMultipartFormData=MyFramework_AFStreamingMultipartFormData AFCompoundResponseSerializer=MyFramework_AFCompoundResponseSerializer AFHTTPResponseSerializer=MyFramework_AFHTTPResponseSerializer AFImageResponseSerializer=MyFramework_AFImageResponseSerializer AFJSONResponseSerializer=MyFramework_AFJSONResponseSerializer AFPropertyListResponseSerializer=MyFramework_AFPropertyListResponseSerializer AFXMLParserResponseSerializer=MyFramework_AFXMLParserResponseSerializer 77 | 78 | MANGLED_SPECS_CHECKSUM = 18f61e6e6172fb87ddc7341f3537f30f8c7a3edc 79 | ``` 80 | 81 | This is included in `GCC_PREPROCESSOR_DEFINITIONS` of the `xcconfig` file for every target. All of these symbols will be mangled on subsequent builds. 82 | 83 | The symbols that will be mangled are: 84 | 85 | - Objective C classes. e.g. `AFNetworkReachabilityManager` becomes `MyFramework_AFNetworkReachabilityManager`. 86 | - C and Objective C constants. `AFNetworkingReachabilityDidChangeNotification` becomes `MyFramework_AFNetworkingReachabilityDidChangeNotification`. 87 | - Objective C category selectors. The first component of the selector is mangled. e.g. `-[NSString xxx_abc:def]` becomes `-[NSString MyFramework_xxx_abc:def]`. 88 | 89 | The plugin has only been fully tested with Objective C dependencies. There is no reason why this could not also work for Swift. 90 | 91 | ## Usage 92 | 93 | cocoapods-mangle can be used by adding it to your `Podfile` like this: 94 | 95 | ``` 96 | source 'https://github.com/CocoaPods/Specs.git' 97 | 98 | platform :ios, '8.0' 99 | plugin 'cocoapods-mangle' 100 | 101 | target :MyTarget do 102 | # Dependencies here 103 | end 104 | 105 | ``` 106 | 107 | Now, each time you run `pod install`, cocoapods-mangle updates the `xcconfig` files for all targets to ensure that all symbols in your dependencies are mangled. 108 | 109 | The plugin can be optionally configured with `:xcconfig_path`, `:mangle_prefix` or `:targets`. Here is an example: 110 | 111 | ``` 112 | plugin 'cocoapods-mangle', targets: ['MyTarget'], 113 | mangle_prefix: 'Prefix_' 114 | xcconfig_path: 'path/to/mangle.xcconfig' 115 | ``` 116 | 117 | ## Caveats 118 | 119 | - cocoapods-mangle will only work for source dependencies. Pre-compiled frameworks cannot be mangled. 120 | - Currently only supports iOS. It should be very straightforward to extend support to macOS, tvOS or watchOS. 121 | - Category mangling may cause issues if the dependency does not correctly prefix its category selectors (see http://nshipster.com/namespacing/#method-prefixes). 122 | - Usage of `NSClassFromString(@"MyClass")` will not work after mangling has been applied. You will need to use `NSClassFromString(@"Prefix_MyClass")` for this to work correctly. 123 | 124 | ## Related links 125 | 126 | - [CocoaPods Packager](https://github.com/cocoapods/cocoapods-packager) has similar mangling functionality for packaging `.podspec` files. 127 | - http://blog.sigmapoint.pl/avoiding-dependency-collisions-in-ios-static-library-managed-by-cocoapods/ 128 | - http://pdx.esri.com/blog/namespacing-dependencies/ 129 | -------------------------------------------------------------------------------- /cocoapods-mangle.gemspec: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | require File.expand_path('../lib/cocoapods_mangle/gem_version', __FILE__) 3 | 4 | Gem::Specification.new do |spec| 5 | spec.name = CocoapodsMangle::NAME 6 | spec.version = CocoapodsMangle::VERSION 7 | spec.license = 'Apache-2.0' 8 | spec.email = ['james@intercom.io'] 9 | spec.homepage = 'https://github.com/intercom/cocoapods-mangle' 10 | spec.authors = ['James Treanor, Brian Boyle'] 11 | spec.summary = 'A CocoaPods plugin which mangles ' \ 12 | 'the symbols of your dependencies' 13 | spec.description = 'Mangling your dependencies symbols allows more than ' \ 14 | 'one copy of a dependency to exist without errors. This ' \ 15 | 'plugin mangles your dependecies to make this possible' 16 | spec.files = Dir['lib/**/*.rb'] 17 | spec.test_files = Dir['spec/**/*.rb'] 18 | spec.extra_rdoc_files = ['README.md', 'CHANGELOG.md'] 19 | spec.require_paths = ['lib'] 20 | spec.add_dependency 'cocoapods', '~> 1.15' 21 | end 22 | -------------------------------------------------------------------------------- /lib/cocoapods_mangle.rb: -------------------------------------------------------------------------------- 1 | require 'cocoapods_mangle/gem_version' 2 | require 'cocoapods_mangle/hooks' 3 | -------------------------------------------------------------------------------- /lib/cocoapods_mangle/builder.rb: -------------------------------------------------------------------------------- 1 | require 'cocoapods' 2 | 3 | module CocoapodsMangle 4 | # Builds the supplied targets of a Pods Xcode project. 5 | # 6 | # This is useful for building pods for mangling purposes 7 | class Builder 8 | BUILD_DIR = 'build' 9 | BUILT_PRODUCTS_DIR = "#{BUILD_DIR}/Release-iphonesimulator" 10 | 11 | # @param [String] pods_project_path 12 | # path to the pods project to build. 13 | # 14 | # @param [Array] pod_target_labels 15 | # the pod targets to build. 16 | def initialize(pods_project_path, pod_target_labels) 17 | @pods_project_path = pods_project_path 18 | @pod_target_labels = pod_target_labels 19 | end 20 | 21 | # Build the pods project 22 | def build! 23 | FileUtils.remove_dir(BUILD_DIR, true) 24 | @pod_target_labels.each { |target| build_target(target) } 25 | end 26 | 27 | # Gives the built binaries to be mangled 28 | # @return [Array] Paths to the build pods binaries 29 | def binaries_to_mangle 30 | static_binaries_to_mangle + dynamic_binaries_to_mangle 31 | end 32 | 33 | private 34 | 35 | def build_target(target) 36 | Pod::UI.message "- Building '#{target}'" 37 | output = `xcodebuild -project "#{@pods_project_path}" -target "#{target}" -configuration Release -sdk iphonesimulator build 2>&1` 38 | unless $?.success? 39 | raise "error: Building the Pods target '#{target}' failed.\ This is the build log:\n#{output}" 40 | end 41 | end 42 | 43 | def static_binaries_to_mangle 44 | Dir.glob("#{BUILT_PRODUCTS_DIR}/**/*.a").reject do |binary_path| 45 | File.basename(binary_path).start_with?('libPods-') 46 | end 47 | end 48 | 49 | def dynamic_binaries_to_mangle 50 | frameworks = Dir.glob("#{BUILT_PRODUCTS_DIR}/**/*.framework") 51 | framework = frameworks.reject do |framework_path| 52 | File.basename(framework_path).start_with?('Pods_') 53 | end 54 | framework.map { |path| "#{path}/#{File.basename(path, '.framework')}" } 55 | end 56 | end 57 | end 58 | -------------------------------------------------------------------------------- /lib/cocoapods_mangle/config.rb: -------------------------------------------------------------------------------- 1 | require 'xcodeproj' 2 | require 'cocoapods' 3 | require 'cocoapods_mangle/builder' 4 | require 'cocoapods_mangle/defines' 5 | 6 | module CocoapodsMangle 7 | # Manages xcconfig files for configuring mangling. 8 | class Config 9 | MANGLING_DEFINES_XCCONFIG_KEY = 'MANGLING_DEFINES' 10 | MANGLED_SPECS_CHECKSUM_XCCONFIG_KEY = 'MANGLED_SPECS_CHECKSUM' 11 | 12 | # @param [CocoapodsMangle::Context] context The context for mangling. 13 | def initialize(context) 14 | @context = context 15 | end 16 | 17 | # Update the mangling xcconfig file with new mangling defines 18 | def update_mangling! 19 | Pod::UI.message '- Updating mangling xcconfig' do 20 | builder = Builder.new(@context.pods_project_path, @context.pod_target_labels) 21 | builder.build! 22 | 23 | defines = Defines.mangling_defines(@context.mangle_prefix, builder.binaries_to_mangle) 24 | 25 | contents = <<~MANGLE_XCCONFIG 26 | // This config file is automatically generated any time Podfile.lock changes 27 | // Changes should be committed to git along with Podfile.lock 28 | 29 | #{MANGLING_DEFINES_XCCONFIG_KEY} = #{defines.join(' ')} 30 | 31 | // This checksum is used to ensure mangling is up to date 32 | #{MANGLED_SPECS_CHECKSUM_XCCONFIG_KEY} = #{@context.specs_checksum} 33 | MANGLE_XCCONFIG 34 | 35 | Pod::UI.message "- Writing '#{File.basename(@context.xcconfig_path)}'" 36 | File.open(@context.xcconfig_path, 'w') { |xcconfig| xcconfig.write(contents) } 37 | end 38 | end 39 | 40 | # Does the mangling xcconfig need to be updated? 41 | # @return [Truthy] Does the xcconfig need to be updated? 42 | def needs_update? 43 | return true unless File.exist?(@context.xcconfig_path) 44 | xcconfig_hash = Xcodeproj::Config.new(File.new(@context.xcconfig_path)).to_hash 45 | needs_update = xcconfig_hash[MANGLED_SPECS_CHECKSUM_XCCONFIG_KEY] != @context.specs_checksum 46 | Pod::UI.message '- Mangling config already up to date' unless needs_update 47 | needs_update 48 | end 49 | 50 | # Update all pod xcconfigs to use the mangling defines 51 | def update_pod_xcconfigs_for_mangling! 52 | Pod::UI.message '- Updating Pod xcconfig files' do 53 | @context.pod_xcconfig_paths.each do |pod_xcconfig_path| 54 | Pod::UI.message "- Updating '#{File.basename(pod_xcconfig_path)}'" 55 | update_pod_xcconfig_for_mangling!(pod_xcconfig_path) 56 | end 57 | end 58 | end 59 | 60 | # Update a mangling config to use the mangling defines 61 | # @param [String] pod_xcconfig_path 62 | # Path to the pod xcconfig to update 63 | def update_pod_xcconfig_for_mangling!(pod_xcconfig_path) 64 | mangle_xcconfig_include = "#include \"#{@context.xcconfig_path}\"\n" 65 | 66 | gcc_preprocessor_defs = File.readlines(pod_xcconfig_path).select { |line| line =~ /GCC_PREPROCESSOR_DEFINITIONS/ }.first 67 | gcc_preprocessor_defs.strip! 68 | 69 | xcconfig_contents = File.read(pod_xcconfig_path) 70 | # import the mangling config 71 | new_xcconfig_contents = mangle_xcconfig_include + xcconfig_contents 72 | # update GCC_PREPROCESSOR_DEFINITIONS to include mangling 73 | new_xcconfig_contents.sub!(gcc_preprocessor_defs, gcc_preprocessor_defs + " $(#{MANGLING_DEFINES_XCCONFIG_KEY})") 74 | File.open(pod_xcconfig_path, 'w') { |pod_xcconfig| pod_xcconfig.write(new_xcconfig_contents) } 75 | end 76 | end 77 | end 78 | -------------------------------------------------------------------------------- /lib/cocoapods_mangle/context.rb: -------------------------------------------------------------------------------- 1 | module CocoapodsMangle 2 | # Context for mangling 3 | class Context 4 | # Initializes the context for mangling 5 | # @param [Pod::Installer::PostInstallHooksContext] installer_context 6 | # The post install context 7 | # @param [Hash] options 8 | # @option options [String] :xcconfig_path 9 | # The path to the mangling xcconfig 10 | # @option options [String] :mangle_prefix 11 | # The prefix to prepend to mangled symbols 12 | # @option options [Array] :targets 13 | # The user targets whose dependencies should be mangled 14 | def initialize(installer_context, options) 15 | @installer_context = installer_context 16 | @options = options 17 | end 18 | 19 | # @return [String] The path to the mangle xcconfig 20 | def xcconfig_path 21 | return default_xcconfig_path unless @options[:xcconfig_path] 22 | File.join(@installer_context.sandbox.root.parent, @options[:xcconfig_path]) 23 | end 24 | 25 | # @return [String] The mangle prefix to be used 26 | def mangle_prefix 27 | return default_mangle_prefix unless @options[:mangle_prefix] 28 | @options[:mangle_prefix] 29 | end 30 | 31 | # @return [String] The path to pods project 32 | def pods_project_path 33 | @installer_context.pods_project.path 34 | end 35 | 36 | # @return [Array] The targets in the pods project to be mangled 37 | def pod_target_labels 38 | umbrella_pod_targets.map(&:cocoapods_target_label) 39 | end 40 | 41 | # @return [Array] Paths to all pod xcconfig files which should be updated 42 | def pod_xcconfig_paths 43 | pod_xcconfigs = [] 44 | @installer_context.pods_project.targets.each do |target| 45 | target.build_configurations.each do |config| 46 | pod_xcconfigs << config.base_configuration_reference.real_path 47 | end 48 | end 49 | pod_xcconfigs.uniq 50 | end 51 | 52 | # @return [String] A checksum representing the current state of the target dependencies 53 | def specs_checksum 54 | gem_summary = "#{CocoapodsMangle::NAME}=#{CocoapodsMangle::VERSION}" 55 | specs = umbrella_pod_targets.map(&:specs).flatten.uniq 56 | specs_summary = specs.map(&:checksum).join(',') 57 | Digest::SHA1.hexdigest("#{gem_summary},#{specs_summary}") 58 | end 59 | 60 | private 61 | 62 | def umbrella_pod_targets 63 | if @options[:targets].nil? || @options[:targets].empty? 64 | return @installer_context.umbrella_targets 65 | end 66 | @installer_context.umbrella_targets.reject do |target| 67 | target_names = target.user_targets.map(&:name) 68 | (@options[:targets] & target_names).empty? 69 | end 70 | end 71 | 72 | def default_xcconfig_path 73 | xcconfig_dir = @installer_context.sandbox.target_support_files_root 74 | xcconfig_filename = "#{CocoapodsMangle::NAME}.xcconfig" 75 | File.join(xcconfig_dir, xcconfig_filename) 76 | end 77 | 78 | def default_mangle_prefix 79 | project_path = umbrella_pod_targets.first.user_project.path 80 | project_name = File.basename(project_path, '.xcodeproj') 81 | project_name.tr(' ', '_') + '_' 82 | end 83 | end 84 | end 85 | -------------------------------------------------------------------------------- /lib/cocoapods_mangle/defines.rb: -------------------------------------------------------------------------------- 1 | module CocoapodsMangle 2 | # Generates mangling defines from a provided list of binaries 3 | module Defines 4 | # @param [String] prefix 5 | # The prefix to prefix to mangled symbols 6 | # @param [Array] binaries_to_mangle 7 | # The binaries containing symbols to be mangled 8 | # @return [Array] The mangling defines 9 | def self.mangling_defines(prefix, binaries_to_mangle) 10 | classes = classes(binaries_to_mangle) 11 | constants = constants(binaries_to_mangle) 12 | category_selectors = category_selectors(binaries_to_mangle, classes) 13 | 14 | defines = prefix_symbols(prefix, classes) 15 | defines += prefix_symbols(prefix, constants) 16 | defines += prefix_selectors(prefix, category_selectors) 17 | defines 18 | end 19 | 20 | # Get the classes defined in a list of binaries 21 | # @param [Array] binaries 22 | # The binaries containing symbols to be mangled 23 | # @return [Array] The classes defined in the binaries 24 | def self.classes(binaries) 25 | all_symbols = run_nm(binaries, '-gU') 26 | all_symbols = all_symbols.reject { |symbol| swift_symbol?(symbol) } 27 | 28 | class_symbols = all_symbols.select do |symbol| 29 | symbol[/OBJC_CLASS_\$_/] 30 | end 31 | class_symbols = class_symbols.map { |klass| klass.gsub(/^.*\$_/, '') } 32 | class_symbols.uniq 33 | end 34 | 35 | # Get the constants defined in a list of binaries 36 | # @param [Array] binaries 37 | # The binaries containing symbols to be mangled 38 | # @return [Array] The constants defined in the binaries 39 | def self.constants(binaries) 40 | all_symbols = run_nm(binaries, '-gU') 41 | all_symbols = all_symbols.reject { |symbol| swift_symbol?(symbol) } 42 | 43 | consts = all_symbols.select { |const| const[/ S /] } 44 | consts = consts.reject { |const| const[/_OBJC_/] } 45 | consts = consts.reject { |const| const[/__block_descriptor.*/] } 46 | consts = consts.map! { |const| const.gsub(/^.* _/, '') } 47 | consts = consts.uniq 48 | 49 | other_consts = all_symbols.select { |const| const[/ T /] } 50 | other_consts = other_consts.reject { |const| const[/__copy_helper_block.*/] } 51 | other_consts = other_consts.reject { |const| const[/__destroy_helper_block.*/] } 52 | other_consts = other_consts.map! { |const| const.gsub(/^.* _/, '') } 53 | other_consts = other_consts.uniq 54 | 55 | consts + other_consts 56 | end 57 | 58 | # Get the category selectors defined in a list of binaries 59 | # @note Selectors on classes which are being mangled will not be mangled 60 | # @param [Array] binaries 61 | # The binaries containing symbols to be mangled 62 | # @param [Array] classes 63 | # The classes which are being mangled 64 | # @return [Array] The category selectors defined in the binaries 65 | def self.category_selectors(binaries, classes) 66 | symbols = run_nm(binaries, '-U') 67 | selectors = symbols.select { |selector| selector[/ t [-|+]\[[^ ]*\([^ ]*\) [^ ]*\]/] } 68 | selectors = selectors.reject do |selector| 69 | class_name = selector[/[-|+]\[(.*?)\(/m, 1] 70 | classes.include? class_name 71 | end 72 | selectors = selectors.map do |selector| 73 | cleaned = selector.split(']').first + ']' 74 | cleaned[/[^ ]*\]\z/][0...-1] 75 | end 76 | selectors = selectors.map { |selector| selector.split(':').first } 77 | selectors.uniq 78 | end 79 | 80 | # Prefix a given list of symbols 81 | # @param [String] prefix 82 | # The prefix to prepend 83 | # @param [Array] symbols 84 | # The symbols to prefix 85 | def self.prefix_symbols(prefix, symbols) 86 | symbols.map do |symbol| 87 | "#{symbol}=#{prefix}#{symbol}" 88 | end 89 | end 90 | 91 | # Prefix a given list of selectors 92 | # @param [String] prefix 93 | # The prefix to use 94 | # @param [Array] selectors 95 | # The selectors to prefix 96 | def self.prefix_selectors(prefix, selectors) 97 | selectors_to_prefix = selectors 98 | defines = [] 99 | 100 | property_setters = selectors.select { |selector| selector[/\Aset[A-Z]/] } 101 | property_setters.each do |property_setter| 102 | property_getter = selectors.find do |selector| 103 | upper_getter = property_setter[3..-1] 104 | lower_getter = upper_getter[0, 1].downcase + upper_getter[1..-1] 105 | selector == upper_getter || selector == lower_getter 106 | end 107 | next if property_getter.nil? 108 | 109 | selectors_to_prefix.reject! { |selector| selector == property_setter } 110 | selectors_to_prefix.reject! { |selector| selector == property_getter } 111 | 112 | defines << "#{property_setter}=set#{prefix}#{property_getter}" 113 | defines << "#{property_getter}=#{prefix}#{property_getter}" 114 | end 115 | 116 | defines += prefix_symbols(prefix, selectors_to_prefix) 117 | defines 118 | end 119 | 120 | # Is symbol a Swift symbol? This is used to avoid mangling Swift. 121 | # @param [String] symbol 122 | # The symbol to check 123 | # @return [Boolean] true if it is a Swift symbol, false otherwise 124 | def self.swift_symbol?(symbol) 125 | # Swift binaries have many symbols starting with $s_ that should be excluded 126 | # e.g. '0000000000000258 S _$s9ManglePod9SomeClassCMF' 127 | symbol[/\$s/] || 128 | # Internal Swift symbols starting with __swift or ___swift such as should not be mangled 129 | # e.g. '00000000000050ac S ___swift_reflection_version' 130 | symbol[/ __(_)?swift/] || 131 | # Internal Swift symbols starting with digit+Swift+optional_digit should not be mangled 132 | # e.g. '34SwiftOverride', '34Swift570Override' 133 | symbol[/\d+Swift(\d+)?/] || 134 | # Internal Swift symbols starting with Swift+digit should not be mangled 135 | # e.g. 'Swift570Override' 136 | symbol[/Swift\d+/] || 137 | # Internal SwiftUI symbols starting with digit+SwiftUI+optional_digit such as should not be mangled 138 | # e.g. '55SwiftUI', '55SwiftUI45' 139 | symbol[/\d+SwiftUI(\d+)?/] || 140 | # Swift symbols starting with symbolic should be ignored 141 | # e.g. '0000000000000248 S symbolic _____ 9ManglePod9SomeClassC' 142 | symbol[/symbolic /] || 143 | # Swift symbol references to Objective-C symbols should not be mangled 144 | # e.g. '00000000000108ca S _associated conformance So26SCNetworkReachabilityFlagsVs10SetAlgebraSCSQ' 145 | symbol[/associated conformance/] || 146 | # " globalinit" symbols should be skipped 147 | # e.g. 0000000000000000 T " globalinit_33_A313450CFC1FC3D0CBEF4411412DB9E8_func0" 148 | symbol[/ globalinit/] || 149 | # "globalinit" symbols should be skipped 150 | # e.g. 0000000000000000 T "globalinit_33_A313450CFC1FC3D0CBEF4411412DB9E8_func0" 151 | symbol[/globalinit/] || 152 | # Swift classes inheriting from Objective-C classes should not be mangled 153 | # e.g. '0000000000000290 S _OBJC_CLASS_$__TtC9ManglePod19SomeFoundationClass' 154 | symbol[/_OBJC_CLASS_\$__/] || 155 | # Swift symbols starting with ____ should be ignored 156 | # e.g. ' ____ 6Lottie15AnimatedControlCC' 157 | symbol[/____ /] || 158 | # _PROTOCOL symbols should be skipped 159 | # e.g. 0000000000000000 _PROTOCOL_METHOD_TYPES_CAAction 160 | symbol[/_PROTOCOL/] || 161 | # _swiftoverride_ symbols should be skipped 162 | # e.g. _swiftoverride_ 163 | symbol[/_\w+_swiftoverride_/] || 164 | # _Zxxxswift symbols should be skipped 165 | # e.g. _ZN5swift34swift50override_conformsToProtocolEPKNS 166 | symbol[/_Z\w+swift/] || 167 | # get_witness_table symbols should be skipped 168 | # e.g. get_witness_table Say6.2 169 | symbol[/get_witness_table /] 170 | end 171 | 172 | def self.run_nm(binaries, flags) 173 | `nm #{flags} #{binaries.join(' ')}`.split("\n") 174 | end 175 | end 176 | end -------------------------------------------------------------------------------- /lib/cocoapods_mangle/gem_version.rb: -------------------------------------------------------------------------------- 1 | module CocoapodsMangle 2 | NAME = 'cocoapods-mangle' 3 | VERSION = '1.1.6' 4 | end 5 | -------------------------------------------------------------------------------- /lib/cocoapods_mangle/hooks.rb: -------------------------------------------------------------------------------- 1 | require 'cocoapods_mangle/context' 2 | require 'cocoapods_mangle/post_install' 3 | 4 | module CocoapodsMangle 5 | # Registers for CocoaPods plugin hooks 6 | module Hooks 7 | Pod::HooksManager.register(CocoapodsMangle::NAME, :post_install) do |installer_context, options| 8 | context = Context.new(installer_context, options) 9 | post_install = CocoapodsMangle::PostInstall.new(context) 10 | Pod::UI.titled_section 'Updating mangling' do 11 | post_install.run! 12 | end 13 | end 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /lib/cocoapods_mangle/post_install.rb: -------------------------------------------------------------------------------- 1 | require 'cocoapods' 2 | require 'cocoapods_mangle/config' 3 | 4 | module CocoapodsMangle 5 | # Runs the post mangling post install action 6 | class PostInstall 7 | # @param [CocoapodsMangle::Context] context The context for mangling. 8 | def initialize(context) 9 | @context = context 10 | end 11 | 12 | # Run the post install action 13 | def run! 14 | config.update_mangling! if config.needs_update? 15 | config.update_pod_xcconfigs_for_mangling! 16 | end 17 | 18 | # @return [CocoapodsMangle::Config] The mangling config object 19 | def config 20 | @config ||= CocoapodsMangle::Config.new(@context) 21 | end 22 | end 23 | end 24 | -------------------------------------------------------------------------------- /lib/cocoapods_plugin.rb: -------------------------------------------------------------------------------- 1 | require 'cocoapods_mangle' 2 | -------------------------------------------------------------------------------- /spec/fixtures/objc-pod/ManglePod.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = 'ManglePod' 3 | s.version = '1.0.0' 4 | s.homepage = 'https://github.com/intercom/cocoapods-mangle' 5 | s.summary = 'A sample pod for integration.' 6 | s.license = 'Apache' 7 | s.author = { 'James Treanor' => 'james@intercom.io' } 8 | s.source = { git: 'git@github.com:intercom/cocoapods-mangle.git' } 9 | s.platform = :ios, '10.0' 10 | s.requires_arc = true 11 | s.source_files = 'Source/**/*.{h,m}' 12 | end 13 | -------------------------------------------------------------------------------- /spec/fixtures/objc-pod/Source/CPMObject+CPMCategory.h: -------------------------------------------------------------------------------- 1 | #import "CPMObject.h" 2 | 3 | @interface CPMObject (CPMCategory) 4 | - (void)cpm_dontMangleDoSomethingWithoutParams; 5 | - (void)cpm_dontMangleDoSomethingWithParam:(NSInteger)firstParam andParam:(NSInteger)otherParam; 6 | @end 7 | -------------------------------------------------------------------------------- /spec/fixtures/objc-pod/Source/CPMObject+CPMCategory.m: -------------------------------------------------------------------------------- 1 | #import "CPMObject+CPMCategory.h" 2 | 3 | @implementation CPMObject (CPMCategory) 4 | - (void)cpm_dontMangleDoSomethingWithoutParams {} 5 | - (void)cpm_dontMangleDoSomethingWithParam:(NSInteger)firstParam andParam:(NSInteger)otherParam {} 6 | @end 7 | -------------------------------------------------------------------------------- /spec/fixtures/objc-pod/Source/CPMObject.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | FOUNDATION_EXPORT const BOOL CPMConstant; 4 | FOUNDATION_EXPORT NSString *CPMStringFromIntegerFunction(int input); 5 | 6 | @interface CPMObject : NSObject 7 | @end 8 | -------------------------------------------------------------------------------- /spec/fixtures/objc-pod/Source/CPMObject.m: -------------------------------------------------------------------------------- 1 | #import "CPMObject.h" 2 | 3 | const BOOL CPMConstant = NO; 4 | NSString * CPMStringFromIntegerFunction(int input) { 5 | return @"output"; 6 | } 7 | 8 | @implementation CPMObject 9 | @end 10 | -------------------------------------------------------------------------------- /spec/fixtures/objc-pod/Source/NSString+CPMCategory.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface NSString (CPMCategory) 4 | - (void)cpm_doSomethingWithoutParams; 5 | - (void)cpm_doSomethingWithParam:(NSInteger)firstParam andParam:(NSInteger)otherParam; 6 | @end 7 | -------------------------------------------------------------------------------- /spec/fixtures/objc-pod/Source/NSString+CPMCategory.m: -------------------------------------------------------------------------------- 1 | #import "NSString+CPMCategory.h" 2 | 3 | @implementation NSString (CPMCategory) 4 | - (void)cpm_doSomethingWithoutParams {} 5 | - (void)cpm_doSomethingWithParam:(NSInteger)firstParam andParam:(NSInteger)otherParam {} 6 | @end 7 | -------------------------------------------------------------------------------- /spec/fixtures/project/Mangle Integration.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 48; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1A334BA41FD954AF008C4963 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A334BA31FD954AF008C4963 /* AppDelegate.m */; }; 11 | 1A334BA71FD954AF008C4963 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A334BA61FD954AF008C4963 /* ViewController.m */; }; 12 | 1A334BAC1FD954AF008C4963 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1A334BAB1FD954AF008C4963 /* Assets.xcassets */; }; 13 | 1A334BB21FD954AF008C4963 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A334BB11FD954AF008C4963 /* main.m */; }; 14 | 1A334BBA1FD95636008C4963 /* Launch.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1A334BB91FD95636008C4963 /* Launch.storyboard */; }; 15 | 49435E462518C045006CA8AE /* Dummy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49435E452518C045006CA8AE /* Dummy.swift */; }; 16 | /* End PBXBuildFile section */ 17 | 18 | /* Begin PBXFileReference section */ 19 | 1A334B9F1FD954AF008C4963 /* Mangle Integration.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Mangle Integration.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 20 | 1A334BA21FD954AF008C4963 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 21 | 1A334BA31FD954AF008C4963 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 22 | 1A334BA51FD954AF008C4963 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 23 | 1A334BA61FD954AF008C4963 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 24 | 1A334BAB1FD954AF008C4963 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 25 | 1A334BB01FD954AF008C4963 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 26 | 1A334BB11FD954AF008C4963 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 27 | 1A334BB91FD95636008C4963 /* Launch.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Launch.storyboard; sourceTree = ""; }; 28 | 49435E452518C045006CA8AE /* Dummy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Dummy.swift; sourceTree = ""; }; 29 | /* End PBXFileReference section */ 30 | 31 | /* Begin PBXFrameworksBuildPhase section */ 32 | 1A334B9C1FD954AF008C4963 /* Frameworks */ = { 33 | isa = PBXFrameworksBuildPhase; 34 | buildActionMask = 2147483647; 35 | files = ( 36 | ); 37 | runOnlyForDeploymentPostprocessing = 0; 38 | }; 39 | /* End PBXFrameworksBuildPhase section */ 40 | 41 | /* Begin PBXGroup section */ 42 | 1A334B961FD954AF008C4963 = { 43 | isa = PBXGroup; 44 | children = ( 45 | 1A334BA11FD954AF008C4963 /* Mangle Integration */, 46 | 1A334BA01FD954AF008C4963 /* Products */, 47 | ); 48 | sourceTree = ""; 49 | }; 50 | 1A334BA01FD954AF008C4963 /* Products */ = { 51 | isa = PBXGroup; 52 | children = ( 53 | 1A334B9F1FD954AF008C4963 /* Mangle Integration.app */, 54 | ); 55 | name = Products; 56 | sourceTree = ""; 57 | }; 58 | 1A334BA11FD954AF008C4963 /* Mangle Integration */ = { 59 | isa = PBXGroup; 60 | children = ( 61 | 1A334BA21FD954AF008C4963 /* AppDelegate.h */, 62 | 1A334BA31FD954AF008C4963 /* AppDelegate.m */, 63 | 1A334BA51FD954AF008C4963 /* ViewController.h */, 64 | 1A334BA61FD954AF008C4963 /* ViewController.m */, 65 | 1A334BAB1FD954AF008C4963 /* Assets.xcassets */, 66 | 1A334BB91FD95636008C4963 /* Launch.storyboard */, 67 | 1A334BB01FD954AF008C4963 /* Info.plist */, 68 | 1A334BB11FD954AF008C4963 /* main.m */, 69 | 49435E452518C045006CA8AE /* Dummy.swift */, 70 | ); 71 | path = "Mangle Integration"; 72 | sourceTree = ""; 73 | }; 74 | /* End PBXGroup section */ 75 | 76 | /* Begin PBXNativeTarget section */ 77 | 1A334B9E1FD954AF008C4963 /* Mangle Integration */ = { 78 | isa = PBXNativeTarget; 79 | buildConfigurationList = 1A334BB51FD954AF008C4963 /* Build configuration list for PBXNativeTarget "Mangle Integration" */; 80 | buildPhases = ( 81 | 1A334B9B1FD954AF008C4963 /* Sources */, 82 | 1A334B9C1FD954AF008C4963 /* Frameworks */, 83 | 1A334B9D1FD954AF008C4963 /* Resources */, 84 | ); 85 | buildRules = ( 86 | ); 87 | dependencies = ( 88 | ); 89 | name = "Mangle Integration"; 90 | productName = "Mangle Integration"; 91 | productReference = 1A334B9F1FD954AF008C4963 /* Mangle Integration.app */; 92 | productType = "com.apple.product-type.application"; 93 | }; 94 | /* End PBXNativeTarget section */ 95 | 96 | /* Begin PBXProject section */ 97 | 1A334B971FD954AF008C4963 /* Project object */ = { 98 | isa = PBXProject; 99 | attributes = { 100 | LastUpgradeCheck = 1170; 101 | ORGANIZATIONNAME = "Cocoapods Mangle"; 102 | TargetAttributes = { 103 | 1A334B9E1FD954AF008C4963 = { 104 | CreatedOnToolsVersion = 9.1; 105 | LastSwiftMigration = 1170; 106 | ProvisioningStyle = Automatic; 107 | }; 108 | }; 109 | }; 110 | buildConfigurationList = 1A334B9A1FD954AF008C4963 /* Build configuration list for PBXProject "Mangle Integration" */; 111 | compatibilityVersion = "Xcode 8.0"; 112 | developmentRegion = en; 113 | hasScannedForEncodings = 0; 114 | knownRegions = ( 115 | en, 116 | Base, 117 | ); 118 | mainGroup = 1A334B961FD954AF008C4963; 119 | productRefGroup = 1A334BA01FD954AF008C4963 /* Products */; 120 | projectDirPath = ""; 121 | projectRoot = ""; 122 | targets = ( 123 | 1A334B9E1FD954AF008C4963 /* Mangle Integration */, 124 | ); 125 | }; 126 | /* End PBXProject section */ 127 | 128 | /* Begin PBXResourcesBuildPhase section */ 129 | 1A334B9D1FD954AF008C4963 /* Resources */ = { 130 | isa = PBXResourcesBuildPhase; 131 | buildActionMask = 2147483647; 132 | files = ( 133 | 1A334BBA1FD95636008C4963 /* Launch.storyboard in Resources */, 134 | 1A334BAC1FD954AF008C4963 /* Assets.xcassets in Resources */, 135 | ); 136 | runOnlyForDeploymentPostprocessing = 0; 137 | }; 138 | /* End PBXResourcesBuildPhase section */ 139 | 140 | /* Begin PBXSourcesBuildPhase section */ 141 | 1A334B9B1FD954AF008C4963 /* Sources */ = { 142 | isa = PBXSourcesBuildPhase; 143 | buildActionMask = 2147483647; 144 | files = ( 145 | 1A334BA71FD954AF008C4963 /* ViewController.m in Sources */, 146 | 1A334BB21FD954AF008C4963 /* main.m in Sources */, 147 | 49435E462518C045006CA8AE /* Dummy.swift in Sources */, 148 | 1A334BA41FD954AF008C4963 /* AppDelegate.m in Sources */, 149 | ); 150 | runOnlyForDeploymentPostprocessing = 0; 151 | }; 152 | /* End PBXSourcesBuildPhase section */ 153 | 154 | /* Begin XCBuildConfiguration section */ 155 | 1A334BB31FD954AF008C4963 /* Debug */ = { 156 | isa = XCBuildConfiguration; 157 | buildSettings = { 158 | ALWAYS_SEARCH_USER_PATHS = NO; 159 | CLANG_ANALYZER_NONNULL = YES; 160 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 161 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 162 | CLANG_CXX_LIBRARY = "libc++"; 163 | CLANG_ENABLE_MODULES = YES; 164 | CLANG_ENABLE_OBJC_ARC = YES; 165 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 166 | CLANG_WARN_BOOL_CONVERSION = YES; 167 | CLANG_WARN_COMMA = YES; 168 | CLANG_WARN_CONSTANT_CONVERSION = YES; 169 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 170 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 171 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 172 | CLANG_WARN_EMPTY_BODY = YES; 173 | CLANG_WARN_ENUM_CONVERSION = YES; 174 | CLANG_WARN_INFINITE_RECURSION = YES; 175 | CLANG_WARN_INT_CONVERSION = YES; 176 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 177 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 178 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 179 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 180 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 181 | CLANG_WARN_STRICT_PROTOTYPES = YES; 182 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 183 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 184 | CLANG_WARN_UNREACHABLE_CODE = YES; 185 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 186 | CODE_SIGN_IDENTITY = "iPhone Developer"; 187 | COPY_PHASE_STRIP = NO; 188 | DEBUG_INFORMATION_FORMAT = dwarf; 189 | ENABLE_STRICT_OBJC_MSGSEND = YES; 190 | ENABLE_TESTABILITY = YES; 191 | GCC_C_LANGUAGE_STANDARD = gnu11; 192 | GCC_DYNAMIC_NO_PIC = NO; 193 | GCC_NO_COMMON_BLOCKS = YES; 194 | GCC_OPTIMIZATION_LEVEL = 0; 195 | GCC_PREPROCESSOR_DEFINITIONS = ( 196 | "DEBUG=1", 197 | "$(inherited)", 198 | ); 199 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 200 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 201 | GCC_WARN_UNDECLARED_SELECTOR = YES; 202 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 203 | GCC_WARN_UNUSED_FUNCTION = YES; 204 | GCC_WARN_UNUSED_VARIABLE = YES; 205 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 206 | MTL_ENABLE_DEBUG_INFO = YES; 207 | ONLY_ACTIVE_ARCH = YES; 208 | SDKROOT = iphoneos; 209 | }; 210 | name = Debug; 211 | }; 212 | 1A334BB41FD954AF008C4963 /* Release */ = { 213 | isa = XCBuildConfiguration; 214 | buildSettings = { 215 | ALWAYS_SEARCH_USER_PATHS = NO; 216 | CLANG_ANALYZER_NONNULL = YES; 217 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 218 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 219 | CLANG_CXX_LIBRARY = "libc++"; 220 | CLANG_ENABLE_MODULES = YES; 221 | CLANG_ENABLE_OBJC_ARC = YES; 222 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 223 | CLANG_WARN_BOOL_CONVERSION = YES; 224 | CLANG_WARN_COMMA = YES; 225 | CLANG_WARN_CONSTANT_CONVERSION = YES; 226 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 227 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 228 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 229 | CLANG_WARN_EMPTY_BODY = YES; 230 | CLANG_WARN_ENUM_CONVERSION = YES; 231 | CLANG_WARN_INFINITE_RECURSION = YES; 232 | CLANG_WARN_INT_CONVERSION = YES; 233 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 234 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 235 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 236 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 237 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 238 | CLANG_WARN_STRICT_PROTOTYPES = YES; 239 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 240 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 241 | CLANG_WARN_UNREACHABLE_CODE = YES; 242 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 243 | CODE_SIGN_IDENTITY = "iPhone Developer"; 244 | COPY_PHASE_STRIP = NO; 245 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 246 | ENABLE_NS_ASSERTIONS = NO; 247 | ENABLE_STRICT_OBJC_MSGSEND = YES; 248 | GCC_C_LANGUAGE_STANDARD = gnu11; 249 | GCC_NO_COMMON_BLOCKS = YES; 250 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 251 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 252 | GCC_WARN_UNDECLARED_SELECTOR = YES; 253 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 254 | GCC_WARN_UNUSED_FUNCTION = YES; 255 | GCC_WARN_UNUSED_VARIABLE = YES; 256 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 257 | MTL_ENABLE_DEBUG_INFO = NO; 258 | SDKROOT = iphoneos; 259 | SWIFT_COMPILATION_MODE = wholemodule; 260 | VALIDATE_PRODUCT = YES; 261 | }; 262 | name = Release; 263 | }; 264 | 1A334BB61FD954AF008C4963 /* Debug */ = { 265 | isa = XCBuildConfiguration; 266 | buildSettings = { 267 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 268 | CLANG_ENABLE_MODULES = YES; 269 | CODE_SIGN_STYLE = Automatic; 270 | INFOPLIST_FILE = "Mangle Integration/Info.plist"; 271 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 272 | PRODUCT_BUNDLE_IDENTIFIER = "org.example.Mangle-Integration"; 273 | PRODUCT_NAME = "$(TARGET_NAME)"; 274 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 275 | SWIFT_VERSION = 5.0; 276 | TARGETED_DEVICE_FAMILY = "1,2"; 277 | }; 278 | name = Debug; 279 | }; 280 | 1A334BB71FD954AF008C4963 /* Release */ = { 281 | isa = XCBuildConfiguration; 282 | buildSettings = { 283 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 284 | CLANG_ENABLE_MODULES = YES; 285 | CODE_SIGN_STYLE = Automatic; 286 | INFOPLIST_FILE = "Mangle Integration/Info.plist"; 287 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 288 | PRODUCT_BUNDLE_IDENTIFIER = "org.example.Mangle-Integration"; 289 | PRODUCT_NAME = "$(TARGET_NAME)"; 290 | SWIFT_VERSION = 5.0; 291 | TARGETED_DEVICE_FAMILY = "1,2"; 292 | }; 293 | name = Release; 294 | }; 295 | /* End XCBuildConfiguration section */ 296 | 297 | /* Begin XCConfigurationList section */ 298 | 1A334B9A1FD954AF008C4963 /* Build configuration list for PBXProject "Mangle Integration" */ = { 299 | isa = XCConfigurationList; 300 | buildConfigurations = ( 301 | 1A334BB31FD954AF008C4963 /* Debug */, 302 | 1A334BB41FD954AF008C4963 /* Release */, 303 | ); 304 | defaultConfigurationIsVisible = 0; 305 | defaultConfigurationName = Release; 306 | }; 307 | 1A334BB51FD954AF008C4963 /* Build configuration list for PBXNativeTarget "Mangle Integration" */ = { 308 | isa = XCConfigurationList; 309 | buildConfigurations = ( 310 | 1A334BB61FD954AF008C4963 /* Debug */, 311 | 1A334BB71FD954AF008C4963 /* Release */, 312 | ); 313 | defaultConfigurationIsVisible = 0; 314 | defaultConfigurationName = Release; 315 | }; 316 | /* End XCConfigurationList section */ 317 | }; 318 | rootObject = 1A334B971FD954AF008C4963 /* Project object */; 319 | } 320 | -------------------------------------------------------------------------------- /spec/fixtures/project/Mangle Integration.xcodeproj/xcshareddata/xcschemes/Mangle Integration.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 37 | 38 | 39 | 40 | 41 | 42 | 52 | 54 | 60 | 61 | 62 | 63 | 69 | 71 | 77 | 78 | 79 | 80 | 82 | 83 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /spec/fixtures/project/Mangle Integration/AppDelegate.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface AppDelegate : UIResponder 4 | @property (strong, nonatomic) UIWindow *window; 5 | @end 6 | 7 | -------------------------------------------------------------------------------- /spec/fixtures/project/Mangle Integration/AppDelegate.m: -------------------------------------------------------------------------------- 1 | #import "AppDelegate.h" 2 | #import "ViewController.h" 3 | 4 | @implementation AppDelegate 5 | 6 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 7 | self.window = [UIWindow new]; 8 | self.window.rootViewController = [ViewController new]; 9 | [self.window makeKeyAndVisible]; 10 | return YES; 11 | } 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /spec/fixtures/project/Mangle Integration/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } -------------------------------------------------------------------------------- /spec/fixtures/project/Mangle Integration/Dummy.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | -------------------------------------------------------------------------------- /spec/fixtures/project/Mangle Integration/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | Launch 25 | UIRequiredDeviceCapabilities 26 | 27 | armv7 28 | 29 | UISupportedInterfaceOrientations 30 | 31 | UIInterfaceOrientationPortrait 32 | UIInterfaceOrientationLandscapeLeft 33 | UIInterfaceOrientationLandscapeRight 34 | 35 | UISupportedInterfaceOrientations~ipad 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationPortraitUpsideDown 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /spec/fixtures/project/Mangle Integration/Launch.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /spec/fixtures/project/Mangle Integration/ViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface ViewController : UIViewController 4 | @end 5 | -------------------------------------------------------------------------------- /spec/fixtures/project/Mangle Integration/ViewController.m: -------------------------------------------------------------------------------- 1 | #import "ViewController.h" 2 | 3 | @implementation ViewController 4 | 5 | - (void)loadView { 6 | [super loadView]; 7 | self.view.backgroundColor = [UIColor whiteColor]; 8 | } 9 | 10 | @end 11 | -------------------------------------------------------------------------------- /spec/fixtures/project/Mangle Integration/main.m: -------------------------------------------------------------------------------- 1 | #import 2 | #import "AppDelegate.h" 3 | 4 | int main(int argc, char * argv[]) { 5 | @autoreleasepool { 6 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /spec/fixtures/swift-pod/ManglePod.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = 'ManglePod' 3 | s.version = '1.0.0' 4 | s.homepage = 'https://github.com/intercom/cocoapods-mangle' 5 | s.summary = 'A sample pod for integration.' 6 | s.license = 'Apache' 7 | s.author = { 'James Treanor' => 'james@intercom.io' } 8 | s.source = { git: 'git@github.com:intercom/cocoapods-mangle.git' } 9 | s.platform = :ios, '10.0' 10 | s.requires_arc = true 11 | s.swift_version = '5.0' 12 | s.source_files = 'Source/*.{swift}' 13 | end 14 | -------------------------------------------------------------------------------- /spec/fixtures/swift-pod/Source/SomeClass.swift: -------------------------------------------------------------------------------- 1 | class SomeClass { 2 | let value = 0 3 | 4 | func someMethod() -> Int { 5 | return value 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /spec/fixtures/swift-pod/Source/SomeFoundationClass.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import SystemConfiguration 3 | 4 | class SomeFoundationClass: NSObject { 5 | let value = 0 6 | 7 | func someMethod(flags: SCNetworkReachabilityFlags) -> SCNetworkReachabilityFlags { 8 | return flags 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /spec/fixtures/swift-pod/Source/SomeFunc.swift: -------------------------------------------------------------------------------- 1 | func someFunc(param: String) -> String { 2 | return param 3 | } 4 | -------------------------------------------------------------------------------- /spec/fixtures/swift-pod/Source/SomeStruct.swift: -------------------------------------------------------------------------------- 1 | struct SomeStruct { 2 | let value = 0 3 | 4 | func someMethod() -> Int { 5 | return value 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /spec/fixtures/symbols/all_defined_symbols.txt: -------------------------------------------------------------------------------- 1 | 2 | PINRemoteImage/libPINRemoteImage.a(FLAnimatedImageView+PINRemoteImage.o): 3 | 00000000000004c4 t -[FLAnimatedImageView(PINRemoteImage) pin_cancelImageDownload] 4 | 00000000000005ff t -[FLAnimatedImageView(PINRemoteImage) pin_clearImages] 5 | 00000000000004e3 t -[FLAnimatedImageView(PINRemoteImage) pin_downloadImageOperationUUID] 6 | 000000000000063e t -[FLAnimatedImageView(PINRemoteImage) pin_ignoreGIFs] 7 | 0000000000000502 t -[FLAnimatedImageView(PINRemoteImage) pin_setDownloadImageOperationUUID:] 8 | 0000000000000000 t -[FLAnimatedImageView(PINRemoteImage) pin_setImageFromURL:] 9 | 0000000000000071 t -[FLAnimatedImageView(PINRemoteImage) pin_setImageFromURL:completion:] 10 | 0000000000000025 t -[FLAnimatedImageView(PINRemoteImage) pin_setImageFromURL:placeholderImage:] 11 | 00000000000000bd t -[FLAnimatedImageView(PINRemoteImage) pin_setImageFromURL:placeholderImage:completion:] 12 | 000000000000019f t -[FLAnimatedImageView(PINRemoteImage) pin_setImageFromURL:placeholderImage:processorKey:processor:] 13 | 00000000000002c5 t -[FLAnimatedImageView(PINRemoteImage) pin_setImageFromURL:placeholderImage:processorKey:processor:completion:] 14 | 000000000000012e t -[FLAnimatedImageView(PINRemoteImage) pin_setImageFromURL:processorKey:processor:] 15 | 0000000000000232 t -[FLAnimatedImageView(PINRemoteImage) pin_setImageFromURL:processorKey:processor:completion:] 16 | 00000000000003e2 t -[FLAnimatedImageView(PINRemoteImage) pin_setImageFromURLs:] 17 | 0000000000000407 t -[FLAnimatedImageView(PINRemoteImage) pin_setImageFromURLs:placeholderImage:] 18 | 0000000000000453 t -[FLAnimatedImageView(PINRemoteImage) pin_setImageFromURLs:placeholderImage:completion:] 19 | 0000000000000562 t -[FLAnimatedImageView(PINRemoteImage) pin_setPlaceholderWithImage:] 20 | 0000000000000574 t -[FLAnimatedImageView(PINRemoteImage) pin_updateUIWithImage:animatedImage:] 21 | 0000000000000521 t -[FLAnimatedImageView(PINRemoteImage) pin_updateWithProgress] 22 | 0000000000000540 t -[FLAnimatedImageView(PINRemoteImage) setPin_updateWithProgress:] 23 | 0000000000001af8 s l_OBJC_$_CATEGORY_FLAnimatedImageView_$_PINRemoteImage 24 | 00000000000012c8 s l_OBJC_$_CATEGORY_INSTANCE_METHODS_FLAnimatedImageView_$_PINRemoteImage 25 | 0000000000001aa0 s l_OBJC_$_PROP_LIST_FLAnimatedImageView_$_PINRemoteImage 26 | 00000000000016a0 s l_OBJC_$_PROP_LIST_NSObject 27 | 00000000000019c0 s l_OBJC_$_PROP_LIST_PINRemoteImageCategory 28 | 00000000000014b0 s l_OBJC_$_PROTOCOL_INSTANCE_METHODS_NSObject 29 | 0000000000001680 s l_OBJC_$_PROTOCOL_INSTANCE_METHODS_OPT_NSObject 30 | 0000000000001988 s l_OBJC_$_PROTOCOL_INSTANCE_METHODS_OPT_PINRemoteImageCategory 31 | 00000000000017a0 s l_OBJC_$_PROTOCOL_INSTANCE_METHODS_PINRemoteImageCategory 32 | 00000000000016e8 s l_OBJC_$_PROTOCOL_METHOD_TYPES_NSObject 33 | 00000000000019d8 s l_OBJC_$_PROTOCOL_METHOD_TYPES_PINRemoteImageCategory 34 | 0000000000001788 s l_OBJC_$_PROTOCOL_REFS_PINRemoteImageCategory 35 | 0000000000001a88 s l_OBJC_CATEGORY_PROTOCOLS_$_FLAnimatedImageView_$_PINRemoteImage 36 | 0000000000001c60 S l_OBJC_LABEL_PROTOCOL_$_NSObject 37 | 0000000000001c68 S l_OBJC_LABEL_PROTOCOL_$_PINRemoteImageCategory 38 | 0000000000001ba0 D l_OBJC_PROTOCOL_$_NSObject 39 | 0000000000001c00 D l_OBJC_PROTOCOL_$_PINRemoteImageCategory 40 | 41 | PINRemoteImage/libPINRemoteImage.a(NSData+ImageDetectors.o): 42 | 0000000000000000 t -[NSData(PINImageDetectors) pin_isGIF] 43 | 00000000000000b0 s l_OBJC_$_CATEGORY_INSTANCE_METHODS_NSData_$_PINImageDetectors 44 | 00000000000000d0 s l_OBJC_$_CATEGORY_NSData_$_PINImageDetectors 45 | 46 | PINRemoteImage/libPINRemoteImage.a(PINButton+PINRemoteImage.o): 47 | 0000000000000521 t -[UIButton(PINRemoteImage) pin_cancelImageDownload] 48 | 000000000000062a t -[UIButton(PINRemoteImage) pin_clearImages] 49 | 0000000000000540 t -[UIButton(PINRemoteImage) pin_downloadImageOperationUUID] 50 | 000000000000065c t -[UIButton(PINRemoteImage) pin_ignoreGIFs] 51 | 000000000000055f t -[UIButton(PINRemoteImage) pin_setDownloadImageOperationUUID:] 52 | 0000000000000000 t -[UIButton(PINRemoteImage) pin_setImageFromURL:] 53 | 0000000000000071 t -[UIButton(PINRemoteImage) pin_setImageFromURL:completion:] 54 | 0000000000000025 t -[UIButton(PINRemoteImage) pin_setImageFromURL:placeholderImage:] 55 | 00000000000000bd t -[UIButton(PINRemoteImage) pin_setImageFromURL:placeholderImage:completion:] 56 | 000000000000019f t -[UIButton(PINRemoteImage) pin_setImageFromURL:placeholderImage:processorKey:processor:] 57 | 00000000000002c5 t -[UIButton(PINRemoteImage) pin_setImageFromURL:placeholderImage:processorKey:processor:completion:] 58 | 000000000000012e t -[UIButton(PINRemoteImage) pin_setImageFromURL:processorKey:processor:] 59 | 0000000000000232 t -[UIButton(PINRemoteImage) pin_setImageFromURL:processorKey:processor:completion:] 60 | 000000000000043f t -[UIButton(PINRemoteImage) pin_setImageFromURLs:] 61 | 0000000000000464 t -[UIButton(PINRemoteImage) pin_setImageFromURLs:placeholderImage:] 62 | 00000000000004b0 t -[UIButton(PINRemoteImage) pin_setImageFromURLs:placeholderImage:completion:] 63 | 00000000000005bf t -[UIButton(PINRemoteImage) pin_setPlaceholderWithImage:] 64 | 00000000000005d3 t -[UIButton(PINRemoteImage) pin_updateUIWithImage:animatedImage:] 65 | 000000000000057e t -[UIButton(PINRemoteImage) pin_updateWithProgress] 66 | 000000000000059d t -[UIButton(PINRemoteImage) setPin_updateWithProgress:] 67 | 00000000000012d8 s l_OBJC_$_CATEGORY_INSTANCE_METHODS_UIButton_$_PINRemoteImage 68 | 0000000000001b08 s l_OBJC_$_CATEGORY_UIButton_$_PINRemoteImage 69 | 00000000000016b0 s l_OBJC_$_PROP_LIST_NSObject 70 | 00000000000019d0 s l_OBJC_$_PROP_LIST_PINRemoteImageCategory 71 | 0000000000001ab0 s l_OBJC_$_PROP_LIST_UIButton_$_PINRemoteImage 72 | 00000000000014c0 s l_OBJC_$_PROTOCOL_INSTANCE_METHODS_NSObject 73 | 0000000000001690 s l_OBJC_$_PROTOCOL_INSTANCE_METHODS_OPT_NSObject 74 | 0000000000001998 s l_OBJC_$_PROTOCOL_INSTANCE_METHODS_OPT_PINRemoteImageCategory 75 | 00000000000017b0 s l_OBJC_$_PROTOCOL_INSTANCE_METHODS_PINRemoteImageCategory 76 | 00000000000016f8 s l_OBJC_$_PROTOCOL_METHOD_TYPES_NSObject 77 | 00000000000019e8 s l_OBJC_$_PROTOCOL_METHOD_TYPES_PINRemoteImageCategory 78 | 0000000000001798 s l_OBJC_$_PROTOCOL_REFS_PINRemoteImageCategory 79 | 0000000000001a98 s l_OBJC_CATEGORY_PROTOCOLS_$_UIButton_$_PINRemoteImage 80 | 0000000000001c70 S l_OBJC_LABEL_PROTOCOL_$_NSObject 81 | 0000000000001c78 S l_OBJC_LABEL_PROTOCOL_$_PINRemoteImageCategory 82 | 0000000000001bb0 D l_OBJC_PROTOCOL_$_NSObject 83 | 0000000000001c10 D l_OBJC_PROTOCOL_$_PINRemoteImageCategory 84 | 85 | PINRemoteImage/libPINRemoteImage.a(PINDataTaskOperation.o): 86 | 000000000000008c t +[PINDataTaskOperation dataTaskOperationWithSessionManager:request:completionHandler:] 87 | 0000000000000680 t -[PINDataTaskOperation .cxx_destruct] 88 | 0000000000000437 t -[PINDataTaskOperation cancelTask] 89 | 0000000000000345 t -[PINDataTaskOperation cancel] 90 | 000000000000064a t -[PINDataTaskOperation dataTask] 91 | 0000000000000420 t -[PINDataTaskOperation finish] 92 | 0000000000000000 t -[PINDataTaskOperation init] 93 | 00000000000003e4 t -[PINDataTaskOperation isConcurrent] 94 | 00000000000003ec t -[PINDataTaskOperation isExecuting] 95 | 0000000000000406 t -[PINDataTaskOperation isFinished] 96 | 0000000000000610 t -[PINDataTaskOperation lock] 97 | 000000000000065b t -[PINDataTaskOperation setDataTask:] 98 | 00000000000004e5 t -[PINDataTaskOperation setState:] 99 | 0000000000000296 t -[PINDataTaskOperation start] 100 | 000000000000066f t -[PINDataTaskOperation state] 101 | 000000000000062d t -[PINDataTaskOperation unlock] 102 | 00000000000006b8 S _OBJC_CLASS_$_PINDataTaskOperation 103 | 0000000000000aa8 S _OBJC_IVAR_$_PINDataTaskOperation._dataTask 104 | 0000000000000aa0 S _OBJC_IVAR_$_PINDataTaskOperation._lock 105 | 0000000000000a98 S _OBJC_IVAR_$_PINDataTaskOperation._state 106 | 00000000000006e0 S _OBJC_METACLASS_$_PINDataTaskOperation 107 | 00000000000001d9 t ___86+[PINDataTaskOperation dataTaskOperationWithSessionManager:request:completionHandler:]_block_invoke 108 | 0000000000000b88 s ___block_descriptor_tmp 109 | 0000000000000246 t ___copy_helper_block_ 110 | 0000000000000271 t ___destroy_helper_block_ 111 | 0000000000000db0 s l_OBJC_$_CLASS_METHODS_PINDataTaskOperation 112 | 0000000000001188 s l_OBJC_$_INSTANCE_METHODS_PINDataTaskOperation 113 | 00000000000012f8 s l_OBJC_$_INSTANCE_VARIABLES_PINDataTaskOperation 114 | 0000000000000fc0 s l_OBJC_$_PROP_LIST_NSObject 115 | 0000000000001360 s l_OBJC_$_PROP_LIST_PINDataTaskOperation 116 | 0000000000000dd0 s l_OBJC_$_PROTOCOL_INSTANCE_METHODS_NSObject 117 | 0000000000000fa0 s l_OBJC_$_PROTOCOL_INSTANCE_METHODS_OPT_NSObject 118 | 00000000000010c0 s l_OBJC_$_PROTOCOL_INSTANCE_METHODS_OPT_NSURLSessionDelegate 119 | 0000000000001008 s l_OBJC_$_PROTOCOL_METHOD_TYPES_NSObject 120 | 0000000000001110 s l_OBJC_$_PROTOCOL_METHOD_TYPES_NSURLSessionDelegate 121 | 00000000000010a8 s l_OBJC_$_PROTOCOL_REFS_NSURLSessionDelegate 122 | 0000000000001128 s l_OBJC_CLASS_PROTOCOLS_$_PINDataTaskOperation 123 | 00000000000013c8 s l_OBJC_CLASS_RO_$_PINDataTaskOperation 124 | 00000000000014d0 S l_OBJC_LABEL_PROTOCOL_$_NSObject 125 | 00000000000014d8 S l_OBJC_LABEL_PROTOCOL_$_NSURLSessionDelegate 126 | 0000000000001140 s l_OBJC_METACLASS_RO_$_PINDataTaskOperation 127 | 0000000000001410 D l_OBJC_PROTOCOL_$_NSObject 128 | 0000000000001470 D l_OBJC_PROTOCOL_$_NSURLSessionDelegate 129 | 130 | PINRemoteImage/libPINRemoteImage.a(PINImage+DecodedImage.o): 131 | 0000000000000254 t +[UIImage(PINDecodedImage) pin_decodedImageWithCGImageRef:] 132 | 0000000000000268 t +[UIImage(PINDecodedImage) pin_decodedImageWithCGImageRef:orientation:] 133 | 0000000000000014 t +[UIImage(PINDecodedImage) pin_decodedImageWithData:] 134 | 0000000000000028 t +[UIImage(PINDecodedImage) pin_decodedImageWithData:skipDecodeIfPossible:] 135 | 0000000000000000 T _PINImageJPEGRepresentation 136 | 000000000000000a T _PINImagePNGRepresentation 137 | 00000000000001c0 T _pin_UIImageOrientationFromImageSource 138 | 0000000000000658 s l_OBJC_$_CATEGORY_CLASS_METHODS_UIImage_$_PINDecodedImage 139 | 00000000000006c0 s l_OBJC_$_CATEGORY_UIImage_$_PINDecodedImage 140 | 0000000000000710 s l_switch.table 141 | 0000000000000750 s l_switch.table.21 142 | 143 | PINRemoteImage/libPINRemoteImage.a(PINImage+WebP.o): 144 | 145 | PINRemoteImage/libPINRemoteImage.a(PINImageView+PINRemoteImage.o): 146 | 0000000000000521 t -[UIImageView(PINRemoteImage) pin_cancelImageDownload] 147 | 0000000000000626 t -[UIImageView(PINRemoteImage) pin_clearImages] 148 | 0000000000000540 t -[UIImageView(PINRemoteImage) pin_downloadImageOperationUUID] 149 | 0000000000000656 t -[UIImageView(PINRemoteImage) pin_ignoreGIFs] 150 | 000000000000055f t -[UIImageView(PINRemoteImage) pin_setDownloadImageOperationUUID:] 151 | 0000000000000000 t -[UIImageView(PINRemoteImage) pin_setImageFromURL:] 152 | 0000000000000071 t -[UIImageView(PINRemoteImage) pin_setImageFromURL:completion:] 153 | 0000000000000025 t -[UIImageView(PINRemoteImage) pin_setImageFromURL:placeholderImage:] 154 | 00000000000000bd t -[UIImageView(PINRemoteImage) pin_setImageFromURL:placeholderImage:completion:] 155 | 000000000000019f t -[UIImageView(PINRemoteImage) pin_setImageFromURL:placeholderImage:processorKey:processor:] 156 | 00000000000002c5 t -[UIImageView(PINRemoteImage) pin_setImageFromURL:placeholderImage:processorKey:processor:completion:] 157 | 000000000000012e t -[UIImageView(PINRemoteImage) pin_setImageFromURL:processorKey:processor:] 158 | 0000000000000232 t -[UIImageView(PINRemoteImage) pin_setImageFromURL:processorKey:processor:completion:] 159 | 000000000000043f t -[UIImageView(PINRemoteImage) pin_setImageFromURLs:] 160 | 0000000000000464 t -[UIImageView(PINRemoteImage) pin_setImageFromURLs:placeholderImage:] 161 | 00000000000004b0 t -[UIImageView(PINRemoteImage) pin_setImageFromURLs:placeholderImage:completion:] 162 | 00000000000005bf t -[UIImageView(PINRemoteImage) pin_setPlaceholderWithImage:] 163 | 00000000000005d1 t -[UIImageView(PINRemoteImage) pin_updateUIWithImage:animatedImage:] 164 | 000000000000057e t -[UIImageView(PINRemoteImage) pin_updateWithProgress] 165 | 000000000000059d t -[UIImageView(PINRemoteImage) setPin_updateWithProgress:] 166 | 00000000000012c8 s l_OBJC_$_CATEGORY_INSTANCE_METHODS_UIImageView_$_PINRemoteImage 167 | 0000000000001af8 s l_OBJC_$_CATEGORY_UIImageView_$_PINRemoteImage 168 | 00000000000016a0 s l_OBJC_$_PROP_LIST_NSObject 169 | 00000000000019c0 s l_OBJC_$_PROP_LIST_PINRemoteImageCategory 170 | 0000000000001aa0 s l_OBJC_$_PROP_LIST_UIImageView_$_PINRemoteImage 171 | 00000000000014b0 s l_OBJC_$_PROTOCOL_INSTANCE_METHODS_NSObject 172 | 0000000000001680 s l_OBJC_$_PROTOCOL_INSTANCE_METHODS_OPT_NSObject 173 | 0000000000001988 s l_OBJC_$_PROTOCOL_INSTANCE_METHODS_OPT_PINRemoteImageCategory 174 | 00000000000017a0 s l_OBJC_$_PROTOCOL_INSTANCE_METHODS_PINRemoteImageCategory 175 | 00000000000016e8 s l_OBJC_$_PROTOCOL_METHOD_TYPES_NSObject 176 | 00000000000019d8 s l_OBJC_$_PROTOCOL_METHOD_TYPES_PINRemoteImageCategory 177 | 0000000000001788 s l_OBJC_$_PROTOCOL_REFS_PINRemoteImageCategory 178 | 0000000000001a88 s l_OBJC_CATEGORY_PROTOCOLS_$_UIImageView_$_PINRemoteImage 179 | 0000000000001c60 S l_OBJC_LABEL_PROTOCOL_$_NSObject 180 | 0000000000001c68 S l_OBJC_LABEL_PROTOCOL_$_PINRemoteImageCategory 181 | 0000000000001ba0 D l_OBJC_PROTOCOL_$_NSObject 182 | 0000000000001c00 D l_OBJC_PROTOCOL_$_PINRemoteImageCategory 183 | 184 | PINRemoteImage/libPINRemoteImage.a(PINProgressiveImage.o): 185 | 0000000000001931 t -[PINProgressiveImage .cxx_destruct] 186 | 00000000000011da t -[PINProgressiveImage bytesPerSecond] 187 | 000000000000096f t -[PINProgressiveImage currentImageBlurred:maxProgressiveRenderSize:renderedImageQuality:] 188 | 0000000000001894 t -[PINProgressiveImage currentThreshold] 189 | 000000000000101e t -[PINProgressiveImage data] 190 | 000000000000023e t -[PINProgressiveImage dealloc] 191 | 00000000000004e1 t -[PINProgressiveImage estimatedRemainingTimeThreshold] 192 | 0000000000001268 t -[PINProgressiveImage estimatedRemainingTime] 193 | 0000000000001800 t -[PINProgressiveImage expectedNumberOfBytes] 194 | 00000000000011c0 t -[PINProgressiveImage hasCompletedFirstScan] 195 | 0000000000001822 t -[PINProgressiveImage imageSource] 196 | 0000000000000000 t -[PINProgressiveImage init] 197 | 0000000000001874 t -[PINProgressiveImage isProgressiveJPEG] 198 | 000000000000190c t -[PINProgressiveImage lock] 199 | 00000000000017db t -[PINProgressiveImage mutableData] 200 | 0000000000001364 t -[PINProgressiveImage postProcessImage:withProgress:] 201 | 00000000000003b7 t -[PINProgressiveImage progressThresholds] 202 | 00000000000010d3 t -[PINProgressiveImage scanForSOSinData:startByte:scannedByte:] 203 | 00000000000018c8 t -[PINProgressiveImage scannedByte] 204 | 00000000000018b6 t -[PINProgressiveImage setBytesPerSecond:] 205 | 00000000000018a5 t -[PINProgressiveImage setCurrentThreshold:] 206 | 000000000000044d t -[PINProgressiveImage setEstimatedRemainingTimeThreshold:] 207 | 0000000000001811 t -[PINProgressiveImage setExpectedNumberOfBytes:] 208 | 0000000000001833 t -[PINProgressiveImage setImageSource:] 209 | 0000000000001884 t -[PINProgressiveImage setIsProgressiveJPEG:] 210 | 000000000000191d t -[PINProgressiveImage setLock:] 211 | 00000000000017ec t -[PINProgressiveImage setMutableData:] 212 | 00000000000002f8 t -[PINProgressiveImage setProgressThresholds:] 213 | 00000000000018d9 t -[PINProgressiveImage setScannedByte:] 214 | 000000000000185c t -[PINProgressiveImage setSize:] 215 | 00000000000018fb t -[PINProgressiveImage setSosCount:] 216 | 0000000000000574 t -[PINProgressiveImage setStartTime:] 217 | 0000000000001844 t -[PINProgressiveImage size] 218 | 00000000000018ea t -[PINProgressiveImage sosCount] 219 | 0000000000000608 t -[PINProgressiveImage startTime] 220 | 000000000000069b t -[PINProgressiveImage updateProgressiveImageWithData:expectedNumberOfBytes:] 221 | 00000000000019b8 s LCPI15_2 222 | 0000000000001a30 S _OBJC_CLASS_$_PINProgressiveImage 223 | 0000000000002350 S _OBJC_IVAR_$_PINProgressiveImage._bytesPerSecond 224 | 0000000000002348 S _OBJC_IVAR_$_PINProgressiveImage._currentThreshold 225 | 0000000000002310 S _OBJC_IVAR_$_PINProgressiveImage._estimatedRemainingTimeThreshold 226 | 0000000000002330 S _OBJC_IVAR_$_PINProgressiveImage._expectedNumberOfBytes 227 | 0000000000002300 S _OBJC_IVAR_$_PINProgressiveImage._imageSource 228 | 0000000000002340 S _OBJC_IVAR_$_PINProgressiveImage._isProgressiveJPEG 229 | 0000000000002360 S _OBJC_IVAR_$_PINProgressiveImage._lock 230 | 0000000000002328 S _OBJC_IVAR_$_PINProgressiveImage._mutableData 231 | 0000000000002308 S _OBJC_IVAR_$_PINProgressiveImage._progressThresholds 232 | 0000000000002320 S _OBJC_IVAR_$_PINProgressiveImage._scannedByte 233 | 0000000000002338 S _OBJC_IVAR_$_PINProgressiveImage._size 234 | 0000000000002358 S _OBJC_IVAR_$_PINProgressiveImage._sosCount 235 | 0000000000002318 S _OBJC_IVAR_$_PINProgressiveImage._startTime 236 | 0000000000001a58 S _OBJC_METACLASS_$_PINProgressiveImage 237 | 00000000000017ce t _cleanupBuffer 238 | 00000000000023c8 s l_OBJC_$_INSTANCE_METHODS_PINProgressiveImage 239 | 0000000000002730 s l_OBJC_$_INSTANCE_VARIABLES_PINProgressiveImage 240 | 00000000000028d8 s l_OBJC_$_PROP_LIST_PINProgressiveImage 241 | 00000000000029b0 s l_OBJC_CLASS_RO_$_PINProgressiveImage 242 | 0000000000002380 s l_OBJC_METACLASS_RO_$_PINProgressiveImage 243 | 244 | PINRemoteImage/libPINRemoteImage.a(PINRemoteImage-dummy.o): 245 | 00000000000000d8 S _OBJC_CLASS_$_PodsDummy_PINRemoteImage 246 | 00000000000000b0 S _OBJC_METACLASS_$_PodsDummy_PINRemoteImage 247 | 0000000000000068 s l_OBJC_CLASS_RO_$_PodsDummy_PINRemoteImage 248 | 0000000000000020 s l_OBJC_METACLASS_RO_$_PodsDummy_PINRemoteImage 249 | 250 | PINRemoteImage/libPINRemoteImage.a(PINRemoteImageCallbacks.o): 251 | 00000000000000ca t -[PINRemoteImageCallbacks .cxx_destruct] 252 | 000000000000004b t -[PINRemoteImageCallbacks completionBlock] 253 | 0000000000000082 t -[PINRemoteImageCallbacks progressDownloadBlock] 254 | 000000000000005e t -[PINRemoteImageCallbacks progressImageBlock] 255 | 00000000000000a6 t -[PINRemoteImageCallbacks requestTime] 256 | 0000000000000000 t -[PINRemoteImageCallbacks setCompletionBlock:] 257 | 0000000000000095 t -[PINRemoteImageCallbacks setProgressDownloadBlock:] 258 | 0000000000000071 t -[PINRemoteImageCallbacks setProgressImageBlock:] 259 | 00000000000000b8 t -[PINRemoteImageCallbacks setRequestTime:] 260 | 00000000000004c0 S _OBJC_CLASS_$_PINRemoteImageCallbacks 261 | 0000000000000218 S _OBJC_IVAR_$_PINRemoteImageCallbacks._completionBlock 262 | 0000000000000228 S _OBJC_IVAR_$_PINRemoteImageCallbacks._progressDownloadBlock 263 | 0000000000000220 S _OBJC_IVAR_$_PINRemoteImageCallbacks._progressImageBlock 264 | 0000000000000230 S _OBJC_IVAR_$_PINRemoteImageCallbacks._requestTime 265 | 0000000000000498 S _OBJC_METACLASS_$_PINRemoteImageCallbacks 266 | 00000000000002a0 s l_OBJC_$_INSTANCE_METHODS_PINRemoteImageCallbacks 267 | 0000000000000380 s l_OBJC_$_INSTANCE_VARIABLES_PINRemoteImageCallbacks 268 | 0000000000000408 s l_OBJC_$_PROP_LIST_PINRemoteImageCallbacks 269 | 0000000000000450 s l_OBJC_CLASS_RO_$_PINRemoteImageCallbacks 270 | 0000000000000258 s l_OBJC_METACLASS_RO_$_PINRemoteImageCallbacks 271 | 272 | PINRemoteImage/libPINRemoteImage.a(PINRemoteImageCategoryManager.o): 273 | 000000000000081c t +[PINRemoteImageCategoryManager cancelImageDownloadOnView:] 274 | 00000000000006fd t +[PINRemoteImageCategoryManager downloadImageOperationUUIDOnView:] 275 | 0000000000000711 t +[PINRemoteImageCategoryManager setDownloadImageOperationUUID:onView:] 276 | 0000000000000000 t +[PINRemoteImageCategoryManager setImageOnView:fromURL:] 277 | 00000000000000b5 t +[PINRemoteImageCategoryManager setImageOnView:fromURL:completion:] 278 | 0000000000000048 t +[PINRemoteImageCategoryManager setImageOnView:fromURL:placeholderImage:] 279 | 0000000000000122 t +[PINRemoteImageCategoryManager setImageOnView:fromURL:placeholderImage:completion:] 280 | 00000000000002fc t +[PINRemoteImageCategoryManager setImageOnView:fromURL:placeholderImage:processorKey:processor:] 281 | 000000000000026c t +[PINRemoteImageCategoryManager setImageOnView:fromURL:processorKey:processor:] 282 | 0000000000000455 t +[PINRemoteImageCategoryManager setImageOnView:fromURL:processorKey:processor:completion:] 283 | 00000000000005b8 t +[PINRemoteImageCategoryManager setImageOnView:fromURLs:] 284 | 0000000000000600 t +[PINRemoteImageCategoryManager setImageOnView:fromURLs:placeholderImage:] 285 | 000000000000066d t +[PINRemoteImageCategoryManager setImageOnView:fromURLs:placeholderImage:completion:] 286 | 00000000000008f4 t +[PINRemoteImageCategoryManager setImageOnView:fromURLs:placeholderImage:processorKey:processor:completion:] 287 | 000000000000079c t +[PINRemoteImageCategoryManager setUpdateWithProgressOnView:onView:] 288 | 0000000000000757 t +[PINRemoteImageCategoryManager updateWithProgressOnView:] 289 | 00000000000020b0 S _OBJC_CLASS_$_PINRemoteImageCategoryManager 290 | 0000000000002088 S _OBJC_METACLASS_$_PINRemoteImageCategoryManager 291 | 0000000000000e53 t ___108+[PINRemoteImageCategoryManager setImageOnView:fromURLs:placeholderImage:processorKey:processor:completion:]_block_invoke 292 | 0000000000000f2c t ___108+[PINRemoteImageCategoryManager setImageOnView:fromURLs:placeholderImage:processorKey:processor:completion:]_block_invoke.50 293 | 00000000000011de t ___108+[PINRemoteImageCategoryManager setImageOnView:fromURLs:placeholderImage:processorKey:processor:completion:]_block_invoke.63 294 | 0000000000001233 t ___108+[PINRemoteImageCategoryManager setImageOnView:fromURLs:placeholderImage:processorKey:processor:completion:]_block_invoke.72 295 | 0000000000001580 t ___108+[PINRemoteImageCategoryManager setImageOnView:fromURLs:placeholderImage:processorKey:processor:completion:]_block_invoke.82 296 | 0000000000001057 t ___108+[PINRemoteImageCategoryManager setImageOnView:fromURLs:placeholderImage:processorKey:processor:completion:]_block_invoke_2 297 | 000000000000136f t ___108+[PINRemoteImageCategoryManager setImageOnView:fromURLs:placeholderImage:processorKey:processor:completion:]_block_invoke_2.73 298 | 0000000000001c58 s ___block_descriptor_tmp 299 | 0000000000001c88 s ___block_descriptor_tmp.62 300 | 0000000000001cb8 s ___block_descriptor_tmp.66 301 | 0000000000001ce8 s ___block_descriptor_tmp.71 302 | 0000000000001d18 s ___block_descriptor_tmp.81 303 | 0000000000001d48 s ___block_descriptor_tmp.85 304 | 0000000000001d78 s ___block_descriptor_tmp.89 305 | 0000000000000e87 t ___copy_helper_block_ 306 | 0000000000001194 t ___copy_helper_block_.59 307 | 00000000000011ef t ___copy_helper_block_.64 308 | 0000000000001215 t ___copy_helper_block_.67 309 | 0000000000001510 t ___copy_helper_block_.78 310 | 0000000000001591 t ___copy_helper_block_.83 311 | 00000000000015b7 t ___copy_helper_block_.86 312 | 0000000000000eeb t ___destroy_helper_block_ 313 | 00000000000011b9 t ___destroy_helper_block_.60 314 | 0000000000001206 t ___destroy_helper_block_.65 315 | 0000000000001224 t ___destroy_helper_block_.68 316 | 0000000000001554 t ___destroy_helper_block_.79 317 | 00000000000015a8 t ___destroy_helper_block_.84 318 | 00000000000015e7 t ___destroy_helper_block_.87 319 | 0000000000001e70 s l_OBJC_$_CLASS_METHODS_PINRemoteImageCategoryManager 320 | 0000000000002040 s l_OBJC_CLASS_RO_$_PINRemoteImageCategoryManager 321 | 0000000000001ff8 s l_OBJC_METACLASS_RO_$_PINRemoteImageCategoryManager 322 | 323 | PINRemoteImage/libPINRemoteImage.a(PINRemoteImageDownloadTask.o): 324 | 000000000000096d t -[PINRemoteImageDownloadTask .cxx_destruct] 325 | 00000000000001ae t -[PINRemoteImageDownloadTask callProgressDownloadWithQueue:completedBytes:totalBytes:] 326 | 00000000000003ba t -[PINRemoteImageDownloadTask callProgressImageWithQueue:withImage:renderedImageQuality:] 327 | 0000000000000739 t -[PINRemoteImageDownloadTask cancelWithUUID:manager:] 328 | 0000000000000061 t -[PINRemoteImageDownloadTask hasProgressBlocks] 329 | 0000000000000000 t -[PINRemoteImageDownloadTask init] 330 | 0000000000000948 t -[PINRemoteImageDownloadTask progressImage] 331 | 0000000000000914 t -[PINRemoteImageDownloadTask sessionTaskEndTime] 332 | 00000000000008f0 t -[PINRemoteImageDownloadTask sessionTaskStartTime] 333 | 0000000000000938 t -[PINRemoteImageDownloadTask setHasProgressBlocks:] 334 | 00000000000007d4 t -[PINRemoteImageDownloadTask setPriority:] 335 | 0000000000000959 t -[PINRemoteImageDownloadTask setProgressImage:] 336 | 0000000000000926 t -[PINRemoteImageDownloadTask setSessionTaskEndTime:] 337 | 0000000000000902 t -[PINRemoteImageDownloadTask setSessionTaskStartTime:] 338 | 00000000000008dc t -[PINRemoteImageDownloadTask setUrlSessionTaskOperation:] 339 | 00000000000008cb t -[PINRemoteImageDownloadTask urlSessionTaskOperation] 340 | 00000000000009a0 s GCC_except_table1 341 | 00000000000009e0 S _OBJC_CLASS_$_PINRemoteImageDownloadTask 342 | 0000000000000db8 S _OBJC_IVAR_$_PINRemoteImageDownloadTask._canSetDataTaskPriority 343 | 0000000000000dd8 S _OBJC_IVAR_$_PINRemoteImageDownloadTask._hasProgressBlocks 344 | 0000000000000de0 S _OBJC_IVAR_$_PINRemoteImageDownloadTask._progressImage 345 | 0000000000000dd0 S _OBJC_IVAR_$_PINRemoteImageDownloadTask._sessionTaskEndTime 346 | 0000000000000dc8 S _OBJC_IVAR_$_PINRemoteImageDownloadTask._sessionTaskStartTime 347 | 0000000000000dc0 S _OBJC_IVAR_$_PINRemoteImageDownloadTask._urlSessionTaskOperation 348 | 0000000000000a08 S _OBJC_METACLASS_$_PINRemoteImageDownloadTask 349 | 0000000000000130 t ___47-[PINRemoteImageDownloadTask hasProgressBlocks]_block_invoke 350 | 0000000000000278 t ___86-[PINRemoteImageDownloadTask callProgressDownloadWithQueue:completedBytes:totalBytes:]_block_invoke 351 | 000000000000035c t ___86-[PINRemoteImageDownloadTask callProgressDownloadWithQueue:completedBytes:totalBytes:]_block_invoke_2 352 | 00000000000004ae t ___88-[PINRemoteImageDownloadTask callProgressImageWithQueue:withImage:renderedImageQuality:]_block_invoke 353 | 0000000000000609 t ___88-[PINRemoteImageDownloadTask callProgressImageWithQueue:withImage:renderedImageQuality:]_block_invoke_2 354 | 0000000000000f38 s ___block_descriptor_tmp 355 | 0000000000000f68 s ___block_descriptor_tmp.16 356 | 0000000000000f98 s ___block_descriptor_tmp.19 357 | 0000000000000fc8 s ___block_descriptor_tmp.27 358 | 0000000000000ff8 s ___block_descriptor_tmp.30 359 | 0000000000000184 t ___copy_helper_block_ 360 | 0000000000000376 t ___copy_helper_block_.13 361 | 000000000000039c t ___copy_helper_block_.17 362 | 000000000000068c t ___copy_helper_block_.25 363 | 00000000000006ef t ___copy_helper_block_.28 364 | 000000000000019b t ___destroy_helper_block_ 365 | 000000000000038d t ___destroy_helper_block_.14 366 | 00000000000003ab t ___destroy_helper_block_.18 367 | 00000000000006c3 t ___destroy_helper_block_.26 368 | 0000000000000714 t ___destroy_helper_block_.29 369 | 0000000000001090 s l_OBJC_$_INSTANCE_METHODS_PINRemoteImageDownloadTask 370 | 0000000000001218 s l_OBJC_$_INSTANCE_VARIABLES_PINRemoteImageDownloadTask 371 | 00000000000012e0 s l_OBJC_$_PROP_LIST_PINRemoteImageDownloadTask 372 | 0000000000001338 s l_OBJC_CLASS_RO_$_PINRemoteImageDownloadTask 373 | 0000000000001048 s l_OBJC_METACLASS_RO_$_PINRemoteImageDownloadTask 374 | 375 | PINRemoteImage/libPINRemoteImage.a(PINRemoteImageManager.o): 376 | 000000000000013e t +[PINRemoteImageManager setSharedImageManagerWithConfiguration:] 377 | 000000000000007e t +[PINRemoteImageManager sharedImageManager] 378 | 000000000000002c t +[PINRemoteImageManager supportsQOS] 379 | 00000000000089ea t -[NSOperationQueue(PINRemoteImageManager) pin_addOperationWithQueuePriority:block:] 380 | 0000000000008920 t -[PINRemoteImageManager .cxx_destruct] 381 | 0000000000007835 t -[PINRemoteImageManager addTaskBPS:endDate:] 382 | 00000000000088fc t -[PINRemoteImageManager authenticationChallengeHandler] 383 | 00000000000085cd t -[PINRemoteImageManager cacheKeyForURL:processorKey:] 384 | 00000000000086af t -[PINRemoteImageManager cache] 385 | 0000000000008800 t -[PINRemoteImageManager callbackQueue] 386 | 00000000000052c3 t -[PINRemoteImageManager cancelTaskWithUUID:] 387 | 0000000000008742 t -[PINRemoteImageManager canceledTasks] 388 | 0000000000008825 t -[PINRemoteImageManager concurrentOperationQueue] 389 | 00000000000074a3 t -[PINRemoteImageManager currentBytesPerSecond] 390 | 0000000000000600 t -[PINRemoteImageManager defaultImageCache] 391 | 00000000000072a2 t -[PINRemoteImageManager didCompleteTask:withError:] 392 | 0000000000006a9c t -[PINRemoteImageManager didReceiveAuthenticationChallenge:forTask:completionHandler:] 393 | 0000000000006c0a t -[PINRemoteImageManager didReceiveData:forTask:] 394 | 0000000000004ceb t -[PINRemoteImageManager downloadDataWithURL:key:priority:completion:] 395 | 000000000000177e t -[PINRemoteImageManager downloadImageWithURL:completion:] 396 | 00000000000017d8 t -[PINRemoteImageManager downloadImageWithURL:options:completion:] 397 | 0000000000002e06 t -[PINRemoteImageManager downloadImageWithURL:options:priority:key:processor:UUID:] 398 | 0000000000003931 t -[PINRemoteImageManager downloadImageWithURL:options:priority:key:progressImage:UUID:] 399 | 0000000000001baa t -[PINRemoteImageManager downloadImageWithURL:options:priority:processorKey:processor:progressImage:progressDownload:completion:inputUUID:] 400 | 0000000000001a27 t -[PINRemoteImageManager downloadImageWithURL:options:processorKey:processor:completion:] 401 | 0000000000001adc t -[PINRemoteImageManager downloadImageWithURL:options:processorKey:processor:progressDownload:completion:] 402 | 00000000000018d3 t -[PINRemoteImageManager downloadImageWithURL:options:progressDownload:completion:] 403 | 0000000000001838 t -[PINRemoteImageManager downloadImageWithURL:options:progressImage:completion:] 404 | 000000000000196e t -[PINRemoteImageManager downloadImageWithURL:options:progressImage:progressDownload:completion:] 405 | 0000000000007a61 t -[PINRemoteImageManager downloadImageWithURLs:options:progressImage:completion:] 406 | 0000000000003ac7 t -[PINRemoteImageManager earlyReturnWithOptions:url:object:completion:] 407 | 00000000000087dc t -[PINRemoteImageManager estimatedRemainingTimeThreshold] 408 | 0000000000003eea t -[PINRemoteImageManager handleCacheObject:object:key:options:outImage:outAnimatedImage:] 409 | 0000000000008894 t -[PINRemoteImageManager highQualityBPSThreshold] 410 | 00000000000062dd t -[PINRemoteImageManager imageFromCacheWithCacheKey:completion:] 411 | 0000000000006324 t -[PINRemoteImageManager imageFromCacheWithCacheKey:options:completion:] 412 | 000000000000025f t -[PINRemoteImageManager initWithSessionConfiguration:] 413 | 000000000000024b t -[PINRemoteImageManager init] 414 | 000000000000063e t -[PINRemoteImageManager lockOnMainThread] 415 | 000000000000065b t -[PINRemoteImageManager lock] 416 | 00000000000088b8 t -[PINRemoteImageManager lowQualityBPSThreshold] 417 | 00000000000087ac t -[PINRemoteImageManager maxProgressiveRenderSize] 418 | 000000000000526e t -[PINRemoteImageManager prefetchImageWithURL:] 419 | 0000000000005285 t -[PINRemoteImageManager prefetchImageWithURL:options:] 420 | 000000000000511f t -[PINRemoteImageManager prefetchImagesWithURLs:] 421 | 0000000000005136 t -[PINRemoteImageManager prefetchImagesWithURLs:options:] 422 | 0000000000008767 t -[PINRemoteImageManager progressThresholds] 423 | 00000000000086d4 t -[PINRemoteImageManager sessionManager] 424 | 0000000000004156 t -[PINRemoteImageManager sessionTaskWithURL:key:options:priority:] 425 | 0000000000000695 t -[PINRemoteImageManager setAuthenticationChallenge:] 426 | 000000000000890f t -[PINRemoteImageManager setAuthenticationChallengeHandler:] 427 | 00000000000086c0 t -[PINRemoteImageManager setCache:] 428 | 0000000000008811 t -[PINRemoteImageManager setCallbackQueue:] 429 | 0000000000008753 t -[PINRemoteImageManager setCanceledTasks:] 430 | 0000000000008836 t -[PINRemoteImageManager setConcurrentOperationQueue:] 431 | 00000000000087ee t -[PINRemoteImageManager setEstimatedRemainingTimeThreshold:] 432 | 0000000000000ba5 t -[PINRemoteImageManager setEstimatedRemainingTimeThresholdForProgressiveDownloads:completion:] 433 | 00000000000088a6 t -[PINRemoteImageManager setHighQualityBPSThreshold:] 434 | 0000000000001286 t -[PINRemoteImageManager setHighQualityBPSThreshold:completion:] 435 | 00000000000088ca t -[PINRemoteImageManager setLowQualityBPSThreshold:] 436 | 0000000000001431 t -[PINRemoteImageManager setLowQualityBPSThreshold:completion:] 437 | 00000000000009e4 t -[PINRemoteImageManager setMaxNumberOfConcurrentDownloads:completion:] 438 | 0000000000000823 t -[PINRemoteImageManager setMaxNumberOfConcurrentOperations:completion:] 439 | 00000000000087c4 t -[PINRemoteImageManager setMaxProgressiveRenderSize:] 440 | 00000000000057da t -[PINRemoteImageManager setPriority:ofTaskWithUUID:] 441 | 0000000000005ce4 t -[PINRemoteImageManager setProgressImageCallback:ofTaskWithUUID:] 442 | 0000000000008778 t -[PINRemoteImageManager setProgressThresholds:] 443 | 0000000000000d50 t -[PINRemoteImageManager setProgressThresholds:completion:] 444 | 00000000000010c8 t -[PINRemoteImageManager setProgressiveRendersMaxProgressiveRenderSize:completion:] 445 | 0000000000000f26 t -[PINRemoteImageManager setProgressiveRendersShouldBlur:completion:] 446 | 00000000000086e5 t -[PINRemoteImageManager setSessionManager:] 447 | 000000000000879c t -[PINRemoteImageManager setShouldBlurProgressive:] 448 | 00000000000088ec t -[PINRemoteImageManager setShouldUpgradeLowQualityImages:] 449 | 00000000000015dc t -[PINRemoteImageManager setShouldUpgradeLowQualityImages:completion:] 450 | 0000000000008880 t -[PINRemoteImageManager setTaskQOS:] 451 | 000000000000872e t -[PINRemoteImageManager setTasks:] 452 | 000000000000870b t -[PINRemoteImageManager setTimeout:] 453 | 000000000000885b t -[PINRemoteImageManager setUrlSessionTaskQueue:] 454 | 000000000000878c t -[PINRemoteImageManager shouldBlurProgressive] 455 | 00000000000088dc t -[PINRemoteImageManager shouldUpgradeLowQualityImages] 456 | 00000000000068af t -[PINRemoteImageManager synchronousImageFromCacheWithCacheKey:options:] 457 | 000000000000886f t -[PINRemoteImageManager taskQOS] 458 | 000000000000871d t -[PINRemoteImageManager tasks] 459 | 00000000000086f9 t -[PINRemoteImageManager timeout] 460 | 0000000000000678 t -[PINRemoteImageManager unlock] 461 | 000000000000884a t -[PINRemoteImageManager urlSessionTaskQueue] 462 | 0000000000008b57 t -[PINTaskQOS .cxx_destruct] 463 | 0000000000008b33 t -[PINTaskQOS bytesPerSecond] 464 | 0000000000008b0e t -[PINTaskQOS endDate] 465 | 0000000000008a87 t -[PINTaskQOS initWithBPS:endDate:] 466 | 0000000000008b45 t -[PINTaskQOS setBytesPerSecond:] 467 | 0000000000008b1f t -[PINTaskQOS setEndDate:] 468 | 0000000000008e1c s GCC_except_table107 469 | 0000000000008f00 s GCC_except_table115 470 | 0000000000008f2c s GCC_except_table116 471 | 0000000000008ff8 s GCC_except_table124 472 | 0000000000009024 s GCC_except_table128 473 | 0000000000009050 s GCC_except_table133 474 | 0000000000009110 s GCC_except_table145 475 | 000000000000913c s GCC_except_table150 476 | 00000000000091b8 s GCC_except_table156 477 | 0000000000009200 s GCC_except_table157 478 | 0000000000008be0 s GCC_except_table65 479 | 0000000000008c0c s GCC_except_table66 480 | 0000000000008c38 s GCC_except_table67 481 | 0000000000008c64 s GCC_except_table68 482 | 0000000000008c90 s GCC_except_table78 483 | 0000000000008cd8 s GCC_except_table79 484 | 0000000000008d38 s GCC_except_table80 485 | 0000000000008d64 s GCC_except_table94 486 | 0000000000008d90 s GCC_except_table95 487 | 0000000000008dbc s GCC_except_table96 488 | 000000000000bf00 S _OBJC_CLASS_$_PINRemoteImageManager 489 | 000000000000bf28 S _OBJC_CLASS_$_PINTaskQOS 490 | 000000000000c038 S _OBJC_IVAR_$_PINRemoteImageManager._authenticationChallengeHandler 491 | 000000000000bff8 S _OBJC_IVAR_$_PINRemoteImageManager._cache 492 | 000000000000bfb0 S _OBJC_IVAR_$_PINRemoteImageManager._callbackQueue 493 | 000000000000c018 S _OBJC_IVAR_$_PINRemoteImageManager._canceledTasks 494 | 000000000000bfc0 S _OBJC_IVAR_$_PINRemoteImageManager._concurrentOperationQueue 495 | 000000000000c028 S _OBJC_IVAR_$_PINRemoteImageManager._estimatedRemainingTimeThreshold 496 | 000000000000bfd0 S _OBJC_IVAR_$_PINRemoteImageManager._highQualityBPSThreshold 497 | 000000000000bfb8 S _OBJC_IVAR_$_PINRemoteImageManager._lock 498 | 000000000000bfd8 S _OBJC_IVAR_$_PINRemoteImageManager._lowQualityBPSThreshold 499 | 000000000000bff0 S _OBJC_IVAR_$_PINRemoteImageManager._maxProgressiveRenderSize 500 | 000000000000c020 S _OBJC_IVAR_$_PINRemoteImageManager._progressThresholds 501 | 000000000000c000 S _OBJC_IVAR_$_PINRemoteImageManager._sessionManager 502 | 000000000000bfe8 S _OBJC_IVAR_$_PINRemoteImageManager._shouldBlurProgressive 503 | 000000000000bfe0 S _OBJC_IVAR_$_PINRemoteImageManager._shouldUpgradeLowQualityImages 504 | 000000000000c030 S _OBJC_IVAR_$_PINRemoteImageManager._taskQOS 505 | 000000000000c010 S _OBJC_IVAR_$_PINRemoteImageManager._tasks 506 | 000000000000c008 S _OBJC_IVAR_$_PINRemoteImageManager._timeout 507 | 000000000000bfc8 S _OBJC_IVAR_$_PINRemoteImageManager._urlSessionTaskQueue 508 | 000000000000c048 S _OBJC_IVAR_$_PINTaskQOS._bytesPerSecond 509 | 000000000000c040 S _OBJC_IVAR_$_PINTaskQOS._endDate 510 | 000000000000bf50 S _OBJC_METACLASS_$_PINRemoteImageManager 511 | 000000000000bf78 S _OBJC_METACLASS_$_PINTaskQOS 512 | 0000000000009b30 S _PINRemoteImageManagerErrorDomain 513 | 000000000000200d t ___138-[PINRemoteImageManager downloadImageWithURL:options:priority:processorKey:processor:progressImage:progressDownload:completion:inputUUID:]_block_invoke 514 | 00000000000023c4 t ___138-[PINRemoteImageManager downloadImageWithURL:options:priority:processorKey:processor:progressImage:progressDownload:completion:inputUUID:]_block_invoke_2 515 | 000000000000251b t ___138-[PINRemoteImageManager downloadImageWithURL:options:priority:processorKey:processor:progressImage:progressDownload:completion:inputUUID:]_block_invoke_3 516 | 0000000000002713 t ___138-[PINRemoteImageManager downloadImageWithURL:options:priority:processorKey:processor:progressImage:progressDownload:completion:inputUUID:]_block_invoke_4 517 | 0000000000000057 t ___36+[PINRemoteImageManager supportsQOS]_block_invoke 518 | 00000000000000e6 t ___43+[PINRemoteImageManager sharedImageManager]_block_invoke 519 | 00000000000079ae t ___44-[PINRemoteImageManager addTaskBPS:endDate:]_block_invoke 520 | 00000000000053b7 t ___44-[PINRemoteImageManager cancelTaskWithUUID:]_block_invoke 521 | 000000000000563e t ___44-[PINRemoteImageManager cancelTaskWithUUID:]_block_invoke.326 522 | 00000000000076e1 t ___46-[PINRemoteImageManager currentBytesPerSecond]_block_invoke 523 | 00000000000070af t ___48-[PINRemoteImageManager didReceiveData:forTask:]_block_invoke 524 | 0000000000000770 t ___52-[PINRemoteImageManager setAuthenticationChallenge:]_block_invoke 525 | 00000000000058e0 t ___52-[PINRemoteImageManager setPriority:ofTaskWithUUID:]_block_invoke 526 | 0000000000000e51 t ___58-[PINRemoteImageManager setProgressThresholds:completion:]_block_invoke 527 | 000000000000151b t ___62-[PINRemoteImageManager setLowQualityBPSThreshold:completion:]_block_invoke 528 | 0000000000001370 t ___63-[PINRemoteImageManager setHighQualityBPSThreshold:completion:]_block_invoke 529 | 00000000000001d8 t ___64+[PINRemoteImageManager setSharedImageManagerWithConfiguration:]_block_invoke 530 | 000000000000429e t ___65-[PINRemoteImageManager sessionTaskWithURL:key:options:priority:]_block_invoke 531 | 0000000000004afb t ___65-[PINRemoteImageManager sessionTaskWithURL:key:options:priority:]_block_invoke.279 532 | 00000000000043d1 t ___65-[PINRemoteImageManager sessionTaskWithURL:key:options:priority:]_block_invoke_2 533 | 0000000000004965 t ___65-[PINRemoteImageManager sessionTaskWithURL:key:options:priority:]_block_invoke_3 534 | 0000000000005e14 t ___65-[PINRemoteImageManager setProgressImageCallback:ofTaskWithUUID:]_block_invoke 535 | 0000000000001008 t ___68-[PINRemoteImageManager setProgressiveRendersShouldBlur:completion:]_block_invoke 536 | 0000000000004f85 t ___69-[PINRemoteImageManager downloadDataWithURL:key:priority:completion:]_block_invoke 537 | 00000000000016be t ___69-[PINRemoteImageManager setShouldUpgradeLowQualityImages:completion:]_block_invoke 538 | 0000000000003e12 t ___70-[PINRemoteImageManager earlyReturnWithOptions:url:object:completion:]_block_invoke 539 | 0000000000000ac6 t ___70-[PINRemoteImageManager setMaxNumberOfConcurrentDownloads:completion:]_block_invoke 540 | 000000000000654d t ___71-[PINRemoteImageManager imageFromCacheWithCacheKey:options:completion:]_block_invoke 541 | 0000000000006751 t ___71-[PINRemoteImageManager imageFromCacheWithCacheKey:options:completion:]_block_invoke_2 542 | 0000000000000905 t ___71-[PINRemoteImageManager setMaxNumberOfConcurrentOperations:completion:]_block_invoke 543 | 0000000000007cdc t ___80-[PINRemoteImageManager downloadImageWithURLs:options:progressImage:completion:]_block_invoke 544 | 000000000000838d t ___80-[PINRemoteImageManager downloadImageWithURLs:options:progressImage:completion:]_block_invoke.464 545 | 00000000000080fe t ___80-[PINRemoteImageManager downloadImageWithURLs:options:progressImage:completion:]_block_invoke_2 546 | 0000000000003032 t ___82-[PINRemoteImageManager downloadImageWithURL:options:priority:key:processor:UUID:]_block_invoke 547 | 0000000000003577 t ___82-[PINRemoteImageManager downloadImageWithURL:options:priority:key:processor:UUID:]_block_invoke_2 548 | 00000000000036f9 t ___82-[PINRemoteImageManager downloadImageWithURL:options:priority:key:processor:UUID:]_block_invoke_3 549 | 00000000000011c1 t ___82-[PINRemoteImageManager setProgressiveRendersMaxProgressiveRenderSize:completion:]_block_invoke 550 | 0000000000006bd5 t ___85-[PINRemoteImageManager didReceiveAuthenticationChallenge:forTask:completionHandler:]_block_invoke 551 | 0000000000000c8f t ___94-[PINRemoteImageManager setEstimatedRemainingTimeThresholdForProgressiveDownloads:completion:]_block_invoke 552 | 0000000000005619 t ___Block_byref_object_copy_ 553 | 000000000000562f t ___Block_byref_object_dispose_ 554 | 0000000000009b38 s ___block_descriptor_tmp 555 | 0000000000009b78 s ___block_descriptor_tmp.10 556 | 0000000000009cf8 s ___block_descriptor_tmp.102 557 | 0000000000009d28 s ___block_descriptor_tmp.107 558 | 0000000000009d58 s ___block_descriptor_tmp.112 559 | 0000000000009d88 s ___block_descriptor_tmp.117 560 | 0000000000009ba8 s ___block_descriptor_tmp.16 561 | 0000000000009db8 s ___block_descriptor_tmp.192 562 | 0000000000009de8 s ___block_descriptor_tmp.199 563 | 0000000000009e18 s ___block_descriptor_tmp.205 564 | 0000000000009e48 s ___block_descriptor_tmp.209 565 | 0000000000009e78 s ___block_descriptor_tmp.226 566 | 0000000000009ea8 s ___block_descriptor_tmp.232 567 | 0000000000009ed8 s ___block_descriptor_tmp.238 568 | 0000000000009f08 s ___block_descriptor_tmp.269 569 | 0000000000009f38 s ___block_descriptor_tmp.278 570 | 0000000000009f68 s ___block_descriptor_tmp.282 571 | 0000000000009f98 s ___block_descriptor_tmp.285 572 | 0000000000009fc8 s ___block_descriptor_tmp.289 573 | 0000000000009ff8 s ___block_descriptor_tmp.307 574 | 000000000000a028 s ___block_descriptor_tmp.332 575 | 000000000000a058 s ___block_descriptor_tmp.341 576 | 000000000000a088 s ___block_descriptor_tmp.348 577 | 000000000000a0b8 s ___block_descriptor_tmp.353 578 | 000000000000a0e8 s ___block_descriptor_tmp.360 579 | 000000000000a118 s ___block_descriptor_tmp.363 580 | 000000000000a148 s ___block_descriptor_tmp.369 581 | 000000000000a178 s ___block_descriptor_tmp.407 582 | 000000000000a1a8 s ___block_descriptor_tmp.431 583 | 000000000000a1d8 s ___block_descriptor_tmp.440 584 | 000000000000a218 s ___block_descriptor_tmp.453 585 | 000000000000a248 s ___block_descriptor_tmp.467 586 | 000000000000a278 s ___block_descriptor_tmp.470 587 | 0000000000009bd8 s ___block_descriptor_tmp.74 588 | 0000000000009c08 s ___block_descriptor_tmp.79 589 | 0000000000009c38 s ___block_descriptor_tmp.84 590 | 0000000000009c68 s ___block_descriptor_tmp.87 591 | 0000000000009c98 s ___block_descriptor_tmp.92 592 | 0000000000009cc8 s ___block_descriptor_tmp.97 593 | 0000000000009b58 s ___block_literal_global 594 | 000000000000a1f8 s ___block_literal_global.441 595 | 0000000000000132 t ___copy_helper_block_ 596 | 0000000000001231 t ___copy_helper_block_.100 597 | 00000000000013dc t ___copy_helper_block_.105 598 | 0000000000001587 t ___copy_helper_block_.110 599 | 0000000000001729 t ___copy_helper_block_.115 600 | 000000000000022d t ___copy_helper_block_.13 601 | 0000000000002a8f t ___copy_helper_block_.189 602 | 0000000000002b7f t ___copy_helper_block_.195 603 | 0000000000002c45 t ___copy_helper_block_.202 604 | 0000000000002d19 t ___copy_helper_block_.206 605 | 0000000000003836 t ___copy_helper_block_.223 606 | 000000000000387e t ___copy_helper_block_.229 607 | 00000000000038c6 t ___copy_helper_block_.235 608 | 0000000000003e79 t ___copy_helper_block_.267 609 | 0000000000004a9b t ___copy_helper_block_.276 610 | 0000000000004ba3 t ___copy_helper_block_.280 611 | 0000000000004c0e t ___copy_helper_block_.283 612 | 0000000000004c7c t ___copy_helper_block_.286 613 | 00000000000050b4 t ___copy_helper_block_.304 614 | 000000000000571b t ___copy_helper_block_.329 615 | 0000000000005792 t ___copy_helper_block_.339 616 | 0000000000005c9c t ___copy_helper_block_.346 617 | 0000000000006272 t ___copy_helper_block_.351 618 | 00000000000067d3 t ___copy_helper_block_.358 619 | 0000000000006844 t ___copy_helper_block_.361 620 | 0000000000006be4 t ___copy_helper_block_.366 621 | 0000000000007242 t ___copy_helper_block_.405 622 | 000000000000779e t ___copy_helper_block_.428 623 | 0000000000008334 t ___copy_helper_block_.450 624 | 00000000000084c1 t ___copy_helper_block_.465 625 | 000000000000852c t ___copy_helper_block_.468 626 | 00000000000007ce t ___copy_helper_block_.72 627 | 000000000000098f t ___copy_helper_block_.77 628 | 0000000000000b50 t ___copy_helper_block_.82 629 | 0000000000000cfb t ___copy_helper_block_.85 630 | 0000000000000ebb t ___copy_helper_block_.90 631 | 0000000000001073 t ___copy_helper_block_.95 632 | 0000000000000138 t ___destroy_helper_block_ 633 | 0000000000001264 t ___destroy_helper_block_.101 634 | 000000000000140f t ___destroy_helper_block_.106 635 | 00000000000015ba t ___destroy_helper_block_.111 636 | 000000000000175c t ___destroy_helper_block_.116 637 | 000000000000023c t ___destroy_helper_block_.14 638 | 0000000000002b20 t ___destroy_helper_block_.190 639 | 0000000000002bfb t ___destroy_helper_block_.196 640 | 0000000000002cc8 t ___destroy_helper_block_.203 641 | 0000000000002dae t ___destroy_helper_block_.207 642 | 000000000000385c t ___destroy_helper_block_.224 643 | 00000000000038a4 t ___destroy_helper_block_.230 644 | 0000000000003903 t ___destroy_helper_block_.236 645 | 0000000000003eb7 t ___destroy_helper_block_.268 646 | 0000000000004acd t ___destroy_helper_block_.277 647 | 0000000000004be0 t ___destroy_helper_block_.281 648 | 0000000000004c47 t ___destroy_helper_block_.284 649 | 0000000000004cbd t ___destroy_helper_block_.287 650 | 00000000000050f1 t ___destroy_helper_block_.305 651 | 000000000000575d t ___destroy_helper_block_.330 652 | 00000000000057b8 t ___destroy_helper_block_.340 653 | 0000000000005cc2 t ___destroy_helper_block_.347 654 | 00000000000062af t ___destroy_helper_block_.352 655 | 0000000000006811 t ___destroy_helper_block_.359 656 | 0000000000006881 t ___destroy_helper_block_.362 657 | 0000000000006bfb t ___destroy_helper_block_.367 658 | 0000000000007274 t ___destroy_helper_block_.406 659 | 00000000000077f2 t ___destroy_helper_block_.429 660 | 0000000000008367 t ___destroy_helper_block_.451 661 | 00000000000084fe t ___destroy_helper_block_.466 662 | 0000000000008591 t ___destroy_helper_block_.469 663 | 0000000000000801 t ___destroy_helper_block_.73 664 | 00000000000009c2 t ___destroy_helper_block_.78 665 | 0000000000000b83 t ___destroy_helper_block_.83 666 | 0000000000000d2e t ___destroy_helper_block_.86 667 | 0000000000000ef8 t ___destroy_helper_block_.91 668 | 00000000000010a6 t ___destroy_helper_block_.96 669 | 0000000000000014 T _dataTaskPriorityWithImageManagerPriority 670 | 0000000000000000 T _operationPriorityWithImageManagerPriority 671 | 00000000000115a8 b _sharedDispatchToken 672 | 0000000000011590 b _sharedImageManager 673 | 0000000000011598 b _supportsQOS.onceToken 674 | 00000000000115a0 b _supportsQOS.supportsQOS 675 | 000000000000d4e8 s l_OBJC_$_CATEGORY_INSTANCE_METHODS_NSOperationQueue_$_PINRemoteImageManager 676 | 000000000000d508 s l_OBJC_$_CATEGORY_NSOperationQueue_$_PINRemoteImageManager 677 | 000000000000c538 s l_OBJC_$_CLASS_METHODS_PINRemoteImageManager 678 | 000000000000c948 s l_OBJC_$_INSTANCE_METHODS_PINRemoteImageManager 679 | 000000000000d590 s l_OBJC_$_INSTANCE_METHODS_PINTaskQOS 680 | 000000000000d100 s l_OBJC_$_INSTANCE_VARIABLES_PINRemoteImageManager 681 | 000000000000d628 s l_OBJC_$_INSTANCE_VARIABLES_PINTaskQOS 682 | 000000000000c778 s l_OBJC_$_PROP_LIST_NSObject 683 | 000000000000d348 s l_OBJC_$_PROP_LIST_PINRemoteImageManager 684 | 000000000000d670 s l_OBJC_$_PROP_LIST_PINTaskQOS 685 | 000000000000c588 s l_OBJC_$_PROTOCOL_INSTANCE_METHODS_NSObject 686 | 000000000000c758 s l_OBJC_$_PROTOCOL_INSTANCE_METHODS_OPT_NSObject 687 | 000000000000c8b0 s l_OBJC_$_PROTOCOL_INSTANCE_METHODS_OPT_PINURLSessionManagerDelegate 688 | 000000000000c878 s l_OBJC_$_PROTOCOL_INSTANCE_METHODS_PINURLSessionManagerDelegate 689 | 000000000000c7c0 s l_OBJC_$_PROTOCOL_METHOD_TYPES_NSObject 690 | 000000000000c8d0 s l_OBJC_$_PROTOCOL_METHOD_TYPES_PINURLSessionManagerDelegate 691 | 000000000000c860 s l_OBJC_$_PROTOCOL_REFS_PINURLSessionManagerDelegate 692 | 000000000000c8e8 s l_OBJC_CLASS_PROTOCOLS_$_PINRemoteImageManager 693 | 000000000000d4a0 s l_OBJC_CLASS_RO_$_PINRemoteImageManager 694 | 000000000000d698 s l_OBJC_CLASS_RO_$_PINTaskQOS 695 | 000000000000d7a0 S l_OBJC_LABEL_PROTOCOL_$_NSObject 696 | 000000000000d7a8 S l_OBJC_LABEL_PROTOCOL_$_PINURLSessionManagerDelegate 697 | 000000000000c900 s l_OBJC_METACLASS_RO_$_PINRemoteImageManager 698 | 000000000000d548 s l_OBJC_METACLASS_RO_$_PINTaskQOS 699 | 000000000000d6e0 D l_OBJC_PROTOCOL_$_NSObject 700 | 000000000000d740 D l_OBJC_PROTOCOL_$_PINURLSessionManagerDelegate 701 | 000000000000d7d0 s l_switch.table 702 | 703 | PINRemoteImage/libPINRemoteImage.a(PINRemoteImageManagerResult.o): 704 | 0000000000000000 t +[PINRemoteImageManagerResult imageResultWithImage:animatedImage:requestLength:error:resultType:UUID:] 705 | 00000000000000bb t +[PINRemoteImageManagerResult imageResultWithImage:animatedImage:requestLength:error:resultType:UUID:renderedImageQuality:] 706 | 00000000000007a6 t -[PINRemoteImageManagerResult .cxx_destruct] 707 | 0000000000000783 t -[PINRemoteImageManagerResult UUID] 708 | 000000000000073e t -[PINRemoteImageManagerResult animatedImage] 709 | 00000000000002bc t -[PINRemoteImageManagerResult description] 710 | 0000000000000761 t -[PINRemoteImageManagerResult error] 711 | 000000000000072d t -[PINRemoteImageManagerResult image] 712 | 000000000000018c t -[PINRemoteImageManagerResult initWithImage:animatedImage:requestLength:error:resultType:UUID:renderedImageQuality:] 713 | 0000000000000794 t -[PINRemoteImageManagerResult renderedImageQuality] 714 | 000000000000074f t -[PINRemoteImageManagerResult requestDuration] 715 | 0000000000000772 t -[PINRemoteImageManagerResult resultType] 716 | 0000000000000a68 S _OBJC_CLASS_$_PINRemoteImageManagerResult 717 | 0000000000000ae8 S _OBJC_IVAR_$_PINRemoteImageManagerResult._UUID 718 | 0000000000000ac8 S _OBJC_IVAR_$_PINRemoteImageManagerResult._animatedImage 719 | 0000000000000ad8 S _OBJC_IVAR_$_PINRemoteImageManagerResult._error 720 | 0000000000000ac0 S _OBJC_IVAR_$_PINRemoteImageManagerResult._image 721 | 0000000000000af0 S _OBJC_IVAR_$_PINRemoteImageManagerResult._renderedImageQuality 722 | 0000000000000ad0 S _OBJC_IVAR_$_PINRemoteImageManagerResult._requestDuration 723 | 0000000000000ae0 S _OBJC_IVAR_$_PINRemoteImageManagerResult._resultType 724 | 0000000000000a90 S _OBJC_METACLASS_$_PINRemoteImageManagerResult 725 | 0000000000000e18 s l_OBJC_$_CLASS_METHODS_PINRemoteImageManagerResult 726 | 0000000000000e98 s l_OBJC_$_INSTANCE_METHODS_PINRemoteImageManagerResult 727 | 0000000000000f90 s l_OBJC_$_INSTANCE_VARIABLES_PINRemoteImageManagerResult 728 | 0000000000001078 s l_OBJC_$_PROP_LIST_PINRemoteImageManagerResult 729 | 00000000000010f0 s l_OBJC_CLASS_RO_$_PINRemoteImageManagerResult 730 | 0000000000000e50 s l_OBJC_METACLASS_RO_$_PINRemoteImageManagerResult 731 | 732 | PINRemoteImage/libPINRemoteImage.a(PINRemoteImageProcessorTask.o): 733 | 0000000000000121 t -[PINRemoteImageProcessorTask .cxx_destruct] 734 | 0000000000000000 t -[PINRemoteImageProcessorTask cancelWithUUID:manager:] 735 | 0000000000000110 t -[PINRemoteImageProcessorTask downloadTaskUUID] 736 | 00000000000000fc t -[PINRemoteImageProcessorTask setDownloadTaskUUID:] 737 | 0000000000000138 S _OBJC_CLASS_$_PINRemoteImageProcessorTask 738 | 0000000000000220 S _OBJC_IVAR_$_PINRemoteImageProcessorTask._downloadTaskUUID 739 | 0000000000000160 S _OBJC_METACLASS_$_PINRemoteImageProcessorTask 740 | 0000000000000290 s l_OBJC_$_INSTANCE_METHODS_PINRemoteImageProcessorTask 741 | 00000000000002f8 s l_OBJC_$_INSTANCE_VARIABLES_PINRemoteImageProcessorTask 742 | 0000000000000320 s l_OBJC_$_PROP_LIST_PINRemoteImageProcessorTask 743 | 0000000000000338 s l_OBJC_CLASS_RO_$_PINRemoteImageProcessorTask 744 | 0000000000000248 s l_OBJC_METACLASS_RO_$_PINRemoteImageProcessorTask 745 | 746 | PINRemoteImage/libPINRemoteImage.a(PINRemoteImageTask.o): 747 | 000000000000087c t -[PINRemoteImageTask .cxx_destruct] 748 | 0000000000000134 t -[PINRemoteImageTask addCallbacksWithCompletionBlock:progressImageBlock:progressDownloadBlock:withUUID:] 749 | 00000000000002c5 t -[PINRemoteImageTask callCompletionsWithQueue:remove:withImage:animatedImage:cached:error:] 750 | 0000000000000857 t -[PINRemoteImageTask callbackBlocks] 751 | 00000000000007d5 t -[PINRemoteImageTask cancelWithUUID:manager:] 752 | 0000000000000084 t -[PINRemoteImageTask description] 753 | 0000000000000000 t -[PINRemoteImageTask init] 754 | 0000000000000250 t -[PINRemoteImageTask removeCallbackWithUUID:] 755 | 0000000000000868 t -[PINRemoteImageTask setCallbackBlocks:] 756 | 0000000000000851 t -[PINRemoteImageTask setPriority:] 757 | 0000000000000890 s GCC_except_table4 758 | 00000000000008d8 S _OBJC_CLASS_$_PINRemoteImageTask 759 | 0000000000000d30 S _OBJC_IVAR_$_PINRemoteImageTask._callbackBlocks 760 | 0000000000000900 S _OBJC_METACLASS_$_PINRemoteImageTask 761 | 0000000000000465 t ___91-[PINRemoteImageTask callCompletionsWithQueue:remove:withImage:animatedImage:cached:error:]_block_invoke 762 | 000000000000061f t ___91-[PINRemoteImageTask callCompletionsWithQueue:remove:withImage:animatedImage:cached:error:]_block_invoke_2 763 | 0000000000000cd0 s ___block_descriptor_tmp 764 | 0000000000000d00 s ___block_descriptor_tmp.38 765 | 00000000000006cb t ___copy_helper_block_ 766 | 0000000000000759 t ___copy_helper_block_.35 767 | 000000000000071f t ___destroy_helper_block_ 768 | 0000000000000799 t ___destroy_helper_block_.36 769 | 0000000000000d98 s l_OBJC_$_INSTANCE_METHODS_PINRemoteImageTask 770 | 0000000000000e90 s l_OBJC_$_INSTANCE_VARIABLES_PINRemoteImageTask 771 | 0000000000000eb8 s l_OBJC_$_PROP_LIST_PINRemoteImageTask 772 | 0000000000000ed0 s l_OBJC_CLASS_RO_$_PINRemoteImageTask 773 | 0000000000000d50 s l_OBJC_METACLASS_RO_$_PINRemoteImageTask 774 | 775 | PINRemoteImage/libPINRemoteImage.a(PINRemoteLock.o): 776 | 00000000000000be t -[PINRemoteLock dealloc] 777 | 00000000000000aa t -[PINRemoteLock initWithName:] 778 | 0000000000000014 t -[PINRemoteLock initWithName:lockType:] 779 | 0000000000000000 t -[PINRemoteLock init] 780 | 00000000000000fe t -[PINRemoteLock lockWithBlock:] 781 | 000000000000014b t -[PINRemoteLock lock] 782 | 000000000000015c t -[PINRemoteLock unlock] 783 | 00000000000001e0 S _OBJC_CLASS_$_PINRemoteLock 784 | 0000000000000238 S _OBJC_IVAR_$_PINRemoteLock._lock 785 | 0000000000000208 S _OBJC_METACLASS_$_PINRemoteLock 786 | 0000000000000298 s l_OBJC_$_INSTANCE_METHODS_PINRemoteLock 787 | 0000000000000348 s l_OBJC_$_INSTANCE_VARIABLES_PINRemoteLock 788 | 0000000000000370 s l_OBJC_CLASS_RO_$_PINRemoteLock 789 | 0000000000000250 s l_OBJC_METACLASS_RO_$_PINRemoteLock 790 | 791 | PINRemoteImage/libPINRemoteImage.a(PINURLSessionManager.o): 792 | 0000000000001251 t -[PINURLSessionManager .cxx_destruct] 793 | 0000000000000979 t -[PINURLSessionManager URLSession:dataTask:didReceiveData:] 794 | 000000000000058a t -[PINURLSessionManager URLSession:didReceiveChallenge:completionHandler:] 795 | 0000000000000bd9 t -[PINURLSessionManager URLSession:task:didCompleteWithError:] 796 | 000000000000066c t -[PINURLSessionManager URLSession:task:didReceiveChallenge:completionHandler:] 797 | 000000000000122c t -[PINURLSessionManager completions] 798 | 00000000000002b4 t -[PINURLSessionManager dataTaskWithRequest:completionHandler:] 799 | 0000000000001207 t -[PINURLSessionManager delegateQueues] 800 | 000000000000116b t -[PINURLSessionManager delegate] 801 | 0000000000000000 t -[PINURLSessionManager initWithSessionConfiguration:] 802 | 000000000000024f t -[PINURLSessionManager invalidateSessionAndCancelTasks] 803 | 0000000000000510 t -[PINURLSessionManager lock] 804 | 00000000000011e2 t -[PINURLSessionManager operationQueue] 805 | 0000000000001198 t -[PINURLSessionManager sessionManagerLock] 806 | 00000000000011bd t -[PINURLSessionManager session] 807 | 000000000000123d t -[PINURLSessionManager setCompletions:] 808 | 0000000000001184 t -[PINURLSessionManager setDelegate:] 809 | 0000000000001218 t -[PINURLSessionManager setDelegateQueues:] 810 | 00000000000011f3 t -[PINURLSessionManager setOperationQueue:] 811 | 00000000000011ce t -[PINURLSessionManager setSession:] 812 | 00000000000011a9 t -[PINURLSessionManager setSessionManagerLock:] 813 | 000000000000054d t -[PINURLSessionManager unlock] 814 | 00000000000012c8 S _OBJC_CLASS_$_PINURLSessionManager 815 | 0000000000001f80 S _OBJC_IVAR_$_PINURLSessionManager._completions 816 | 0000000000001f58 S _OBJC_IVAR_$_PINURLSessionManager._delegate 817 | 0000000000001f78 S _OBJC_IVAR_$_PINURLSessionManager._delegateQueues 818 | 0000000000001f70 S _OBJC_IVAR_$_PINURLSessionManager._operationQueue 819 | 0000000000001f68 S _OBJC_IVAR_$_PINURLSessionManager._session 820 | 0000000000001f60 S _OBJC_IVAR_$_PINURLSessionManager._sessionManagerLock 821 | 00000000000012f0 S _OBJC_METACLASS_$_PINURLSessionManager 822 | 0000000000000b0f t ___59-[PINURLSessionManager URLSession:dataTask:didReceiveData:]_block_invoke 823 | 0000000000000eee t ___61-[PINURLSessionManager URLSession:task:didCompleteWithError:]_block_invoke 824 | 0000000000000831 t ___78-[PINURLSessionManager URLSession:task:didReceiveChallenge:completionHandler:]_block_invoke 825 | 0000000000001ec8 s ___block_descriptor_tmp 826 | 0000000000001ef8 s ___block_descriptor_tmp.69 827 | 0000000000001f28 s ___block_descriptor_tmp.93 828 | 00000000000008f3 t ___copy_helper_block_ 829 | 0000000000000b79 t ___copy_helper_block_.67 830 | 000000000000110b t ___copy_helper_block_.91 831 | 0000000000000944 t ___destroy_helper_block_ 832 | 0000000000000bab t ___destroy_helper_block_.68 833 | 000000000000113d t ___destroy_helper_block_.92 834 | 0000000000002bd0 s l_OBJC_$_INSTANCE_METHODS_PINURLSessionManager 835 | 0000000000002de8 s l_OBJC_$_INSTANCE_VARIABLES_PINURLSessionManager 836 | 0000000000002820 s l_OBJC_$_PROP_LIST_NSObject 837 | 0000000000002eb0 s l_OBJC_$_PROP_LIST_PINURLSessionManager 838 | 0000000000002630 s l_OBJC_$_PROTOCOL_INSTANCE_METHODS_NSObject 839 | 0000000000002800 s l_OBJC_$_PROTOCOL_INSTANCE_METHODS_OPT_NSObject 840 | 0000000000002ac0 s l_OBJC_$_PROTOCOL_INSTANCE_METHODS_OPT_NSURLSessionDataDelegate 841 | 0000000000002920 s l_OBJC_$_PROTOCOL_INSTANCE_METHODS_OPT_NSURLSessionDelegate 842 | 00000000000029a0 s l_OBJC_$_PROTOCOL_INSTANCE_METHODS_OPT_NSURLSessionTaskDelegate 843 | 0000000000002868 s l_OBJC_$_PROTOCOL_METHOD_TYPES_NSObject 844 | 0000000000002b40 s l_OBJC_$_PROTOCOL_METHOD_TYPES_NSURLSessionDataDelegate 845 | 0000000000002970 s l_OBJC_$_PROTOCOL_METHOD_TYPES_NSURLSessionDelegate 846 | 0000000000002a68 s l_OBJC_$_PROTOCOL_METHOD_TYPES_NSURLSessionTaskDelegate 847 | 0000000000002aa8 s l_OBJC_$_PROTOCOL_REFS_NSURLSessionDataDelegate 848 | 0000000000002908 s l_OBJC_$_PROTOCOL_REFS_NSURLSessionDelegate 849 | 0000000000002988 s l_OBJC_$_PROTOCOL_REFS_NSURLSessionTaskDelegate 850 | 0000000000002b68 s l_OBJC_CLASS_PROTOCOLS_$_PINURLSessionManager 851 | 0000000000002f58 s l_OBJC_CLASS_RO_$_PINURLSessionManager 852 | 0000000000003120 S l_OBJC_LABEL_PROTOCOL_$_NSObject 853 | 0000000000003138 S l_OBJC_LABEL_PROTOCOL_$_NSURLSessionDataDelegate 854 | 0000000000003128 S l_OBJC_LABEL_PROTOCOL_$_NSURLSessionDelegate 855 | 0000000000003130 S l_OBJC_LABEL_PROTOCOL_$_NSURLSessionTaskDelegate 856 | 0000000000002b88 s l_OBJC_METACLASS_RO_$_PINURLSessionManager 857 | 0000000000002fa0 D l_OBJC_PROTOCOL_$_NSObject 858 | 00000000000030c0 D l_OBJC_PROTOCOL_$_NSURLSessionDataDelegate 859 | 0000000000003000 D l_OBJC_PROTOCOL_$_NSURLSessionDelegate 860 | 0000000000003060 D l_OBJC_PROTOCOL_$_NSURLSessionTaskDelegate 861 | 862 | FLAnimatedImage/libFLAnimatedImage.a(FLAnimatedImage-dummy.o): 863 | 00000000000000d8 S _OBJC_CLASS_$_PodsDummy_FLAnimatedImage 864 | 00000000000000b0 S _OBJC_METACLASS_$_PodsDummy_FLAnimatedImage 865 | 0000000000000068 s l_OBJC_CLASS_RO_$_PodsDummy_FLAnimatedImage 866 | 0000000000000020 s l_OBJC_METACLASS_RO_$_PodsDummy_FLAnimatedImage 867 | 868 | FLAnimatedImage/libFLAnimatedImage.a(FLAnimatedImage.o): 869 | 0000000000001605 t +[FLAnimatedImage animatedImageWithGIFData:] 870 | 0000000000000137 t +[FLAnimatedImage initialize] 871 | 0000000000002aee t +[FLAnimatedImage predrawnImageFromImage:] 872 | 0000000000001fe1 t +[FLAnimatedImage sizeForImage:] 873 | 00000000000033b9 t +[FLAnimatedImage(Logging) logStringFromBlock:withLevel:] 874 | 0000000000003386 t +[FLAnimatedImage(Logging) setLogBlock:logLevel:] 875 | 000000000000341b t +[FLWeakProxy weakProxyForObject:] 876 | 00000000000032de t -[FLAnimatedImage .cxx_destruct] 877 | 00000000000019cd t -[FLAnimatedImage addFrameIndexesToCache:] 878 | 0000000000003278 t -[FLAnimatedImage allFramesIndexSet] 879 | 0000000000003256 t -[FLAnimatedImage cachedFrameIndexes] 880 | 0000000000003245 t -[FLAnimatedImage cachedFramesForIndexes] 881 | 00000000000031cf t -[FLAnimatedImage data] 882 | 0000000000001666 t -[FLAnimatedImage dealloc] 883 | 000000000000319c t -[FLAnimatedImage delayTimesForIndexes] 884 | 0000000000003075 t -[FLAnimatedImage description] 885 | 0000000000002872 t -[FLAnimatedImage didReceiveMemoryWarning:] 886 | 0000000000000000 t -[FLAnimatedImage frameCacheSizeCurrent] 887 | 0000000000003201 t -[FLAnimatedImage frameCacheSizeMaxInternal] 888 | 00000000000031be t -[FLAnimatedImage frameCacheSizeMax] 889 | 00000000000031e0 t -[FLAnimatedImage frameCacheSizeOptimal] 890 | 00000000000031ad t -[FLAnimatedImage frameCount] 891 | 000000000000220f t -[FLAnimatedImage frameIndexesToCache] 892 | 000000000000260c t -[FLAnimatedImage growFrameCacheSizeAfterMemoryWarning:] 893 | 000000000000215b t -[FLAnimatedImage imageAtIndex:] 894 | 00000000000016d0 t -[FLAnimatedImage imageLazilyCachedAtIndex:] 895 | 00000000000032bc t -[FLAnimatedImage imageSource] 896 | 0000000000000340 t -[FLAnimatedImage initWithAnimatedGIFData:] 897 | 000000000000035a t -[FLAnimatedImage initWithAnimatedGIFData:optimalFrameCacheSize:predrawingEnabled:] 898 | 00000000000002c6 t -[FLAnimatedImage init] 899 | 00000000000031f1 t -[FLAnimatedImage isPredrawingEnabled] 900 | 000000000000318b t -[FLAnimatedImage loopCount] 901 | 0000000000003289 t -[FLAnimatedImage memoryWarningCount] 902 | 0000000000003234 t -[FLAnimatedImage posterImageFrameIndex] 903 | 0000000000003162 t -[FLAnimatedImage posterImage] 904 | 00000000000023af t -[FLAnimatedImage purgeFrameCacheIfNeeded] 905 | 0000000000003212 t -[FLAnimatedImage requestedFrameIndex] 906 | 0000000000003267 t -[FLAnimatedImage requestedFrameIndexes] 907 | 000000000000276a t -[FLAnimatedImage resetFrameCacheSizeMaxInternal] 908 | 00000000000032ab t -[FLAnimatedImage serialQueue] 909 | 0000000000000081 t -[FLAnimatedImage setFrameCacheSizeMax:] 910 | 00000000000000dc t -[FLAnimatedImage setFrameCacheSizeMaxInternal:] 911 | 000000000000329a t -[FLAnimatedImage setMemoryWarningCount:] 912 | 0000000000003223 t -[FLAnimatedImage setRequestedFrameIndex:] 913 | 0000000000003173 t -[FLAnimatedImage size] 914 | 00000000000032cd t -[FLAnimatedImage weakProxy] 915 | 0000000000003517 t -[FLWeakProxy .cxx_destruct] 916 | 000000000000349e t -[FLWeakProxy forwardInvocation:] 917 | 0000000000003485 t -[FLWeakProxy forwardingTargetForSelector:] 918 | 00000000000034ca t -[FLWeakProxy methodSignatureForSelector:] 919 | 0000000000003503 t -[FLWeakProxy setTarget:] 920 | 00000000000034ea t -[FLWeakProxy target] 921 | 0000000000003528 s GCC_except_table4 922 | 000000000000359c s GCC_except_table41 923 | 00000000000035c8 s GCC_except_table43 924 | 0000000000003570 s GCC_except_table8 925 | 00000000000042f8 S _OBJC_CLASS_$_FLAnimatedImage 926 | 0000000000004320 S _OBJC_CLASS_$_FLWeakProxy 927 | 00000000000042c8 S _OBJC_IVAR_$_FLAnimatedImage._allFramesIndexSet 928 | 0000000000004278 S _OBJC_IVAR_$_FLAnimatedImage._cachedFrameIndexes 929 | 0000000000004270 S _OBJC_IVAR_$_FLAnimatedImage._cachedFramesForIndexes 930 | 0000000000004260 S _OBJC_IVAR_$_FLAnimatedImage._data 931 | 00000000000042b0 S _OBJC_IVAR_$_FLAnimatedImage._delayTimesForIndexes 932 | 0000000000004250 S _OBJC_IVAR_$_FLAnimatedImage._frameCacheSizeMax 933 | 0000000000004258 S _OBJC_IVAR_$_FLAnimatedImage._frameCacheSizeMaxInternal 934 | 00000000000042c0 S _OBJC_IVAR_$_FLAnimatedImage._frameCacheSizeOptimal 935 | 00000000000042b8 S _OBJC_IVAR_$_FLAnimatedImage._frameCount 936 | 0000000000004288 S _OBJC_IVAR_$_FLAnimatedImage._imageSource 937 | 0000000000004290 S _OBJC_IVAR_$_FLAnimatedImage._loopCount 938 | 00000000000042e8 S _OBJC_IVAR_$_FLAnimatedImage._memoryWarningCount 939 | 0000000000004298 S _OBJC_IVAR_$_FLAnimatedImage._posterImage 940 | 00000000000042a8 S _OBJC_IVAR_$_FLAnimatedImage._posterImageFrameIndex 941 | 0000000000004268 S _OBJC_IVAR_$_FLAnimatedImage._predrawingEnabled 942 | 00000000000042e0 S _OBJC_IVAR_$_FLAnimatedImage._requestedFrameIndex 943 | 0000000000004280 S _OBJC_IVAR_$_FLAnimatedImage._requestedFrameIndexes 944 | 00000000000042d8 S _OBJC_IVAR_$_FLAnimatedImage._serialQueue 945 | 00000000000042a0 S _OBJC_IVAR_$_FLAnimatedImage._size 946 | 00000000000042d0 S _OBJC_IVAR_$_FLAnimatedImage._weakProxy 947 | 00000000000042f0 S _OBJC_IVAR_$_FLWeakProxy._target 948 | 0000000000004348 S _OBJC_METACLASS_$_FLAnimatedImage 949 | 0000000000004370 S _OBJC_METACLASS_$_FLWeakProxy 950 | 000000000000031e t ___23-[FLAnimatedImage init]_block_invoke 951 | 00000000000001ff t ___29+[FLAnimatedImage initialize]_block_invoke 952 | 0000000000002114 t ___32+[FLAnimatedImage sizeForImage:]_block_invoke 953 | 000000000000238d t ___38-[FLAnimatedImage frameIndexesToCache]_block_invoke 954 | 0000000000002f1d t ___42+[FLAnimatedImage predrawnImageFromImage:]_block_invoke 955 | 0000000000002f64 t ___42+[FLAnimatedImage predrawnImageFromImage:]_block_invoke.268 956 | 0000000000002fc8 t ___42+[FLAnimatedImage predrawnImageFromImage:]_block_invoke.280 957 | 0000000000001be4 t ___42-[FLAnimatedImage addFrameIndexesToCache:]_block_invoke 958 | 0000000000001c06 t ___42-[FLAnimatedImage addFrameIndexesToCache:]_block_invoke_2 959 | 0000000000001cd3 t ___42-[FLAnimatedImage addFrameIndexesToCache:]_block_invoke_3 960 | 0000000000001df5 t ___42-[FLAnimatedImage addFrameIndexesToCache:]_block_invoke_4 961 | 00000000000024df t ___42-[FLAnimatedImage purgeFrameCacheIfNeeded]_block_invoke 962 | 0000000000002a5b t ___43-[FLAnimatedImage didReceiveMemoryWarning:]_block_invoke 963 | 0000000000001956 t ___44-[FLAnimatedImage imageLazilyCachedAtIndex:]_block_invoke 964 | 0000000000002801 t ___49-[FLAnimatedImage resetFrameCacheSizeMaxInternal]_block_invoke 965 | 00000000000026f9 t ___56-[FLAnimatedImage growFrameCacheSizeAfterMemoryWarning:]_block_invoke 966 | 00000000000012c5 t ___83-[FLAnimatedImage initWithAnimatedGIFData:optimalFrameCacheSize:predrawingEnabled:]_block_invoke 967 | 00000000000013f0 t ___83-[FLAnimatedImage initWithAnimatedGIFData:optimalFrameCacheSize:predrawingEnabled:]_block_invoke.100 968 | 000000000000146f t ___83-[FLAnimatedImage initWithAnimatedGIFData:optimalFrameCacheSize:predrawingEnabled:]_block_invoke.112 969 | 00000000000014f4 t ___83-[FLAnimatedImage initWithAnimatedGIFData:optimalFrameCacheSize:predrawingEnabled:]_block_invoke.120 970 | 0000000000001577 t ___83-[FLAnimatedImage initWithAnimatedGIFData:optimalFrameCacheSize:predrawingEnabled:]_block_invoke.132 971 | 00000000000015be t ___83-[FLAnimatedImage initWithAnimatedGIFData:optimalFrameCacheSize:predrawingEnabled:]_block_invoke.138 972 | 000000000000132e t ___83-[FLAnimatedImage initWithAnimatedGIFData:optimalFrameCacheSize:predrawingEnabled:]_block_invoke.61 973 | 0000000000001379 t ___83-[FLAnimatedImage initWithAnimatedGIFData:optimalFrameCacheSize:predrawingEnabled:]_block_invoke.92 974 | 00000000000012e7 t ___83-[FLAnimatedImage initWithAnimatedGIFData:optimalFrameCacheSize:predrawingEnabled:]_block_invoke_2 975 | 0000000000001521 t ___83-[FLAnimatedImage initWithAnimatedGIFData:optimalFrameCacheSize:predrawingEnabled:]_block_invoke_2.124 976 | 0000000000004fa8 s ___block_descriptor_tmp 977 | 00000000000050f8 s ___block_descriptor_tmp.105 978 | 0000000000005128 s ___block_descriptor_tmp.117 979 | 0000000000005158 s ___block_descriptor_tmp.123 980 | 0000000000005178 s ___block_descriptor_tmp.129 981 | 00000000000051a8 s ___block_descriptor_tmp.137 982 | 00000000000051d8 s ___block_descriptor_tmp.143 983 | 0000000000005208 s ___block_descriptor_tmp.163 984 | 0000000000005238 s ___block_descriptor_tmp.182 985 | 0000000000005278 s ___block_descriptor_tmp.194 986 | 00000000000052a8 s ___block_descriptor_tmp.198 987 | 00000000000052d8 s ___block_descriptor_tmp.203 988 | 0000000000005308 s ___block_descriptor_tmp.210 989 | 0000000000005338 s ___block_descriptor_tmp.223 990 | 0000000000005378 s ___block_descriptor_tmp.229 991 | 00000000000053a8 s ___block_descriptor_tmp.238 992 | 00000000000053d8 s ___block_descriptor_tmp.249 993 | 0000000000005408 s ___block_descriptor_tmp.262 994 | 0000000000005438 s ___block_descriptor_tmp.267 995 | 0000000000005468 s ___block_descriptor_tmp.273 996 | 0000000000005498 s ___block_descriptor_tmp.285 997 | 0000000000004fe8 s ___block_descriptor_tmp.34 998 | 0000000000005028 s ___block_descriptor_tmp.44 999 | 0000000000005068 s ___block_descriptor_tmp.60 1000 | 0000000000005098 s ___block_descriptor_tmp.66 1001 | 00000000000050c8 s ___block_descriptor_tmp.97 1002 | 0000000000004fc8 s ___block_literal_global 1003 | 0000000000005258 s ___block_literal_global.183 1004 | 0000000000005358 s ___block_literal_global.224 1005 | 0000000000005008 s ___block_literal_global.35 1006 | 0000000000005048 s ___block_literal_global.45 1007 | 0000000000001310 t ___copy_helper_block_ 1008 | 0000000000001425 t ___copy_helper_block_.103 1009 | 00000000000014d6 t ___copy_helper_block_.115 1010 | 0000000000001559 t ___copy_helper_block_.127 1011 | 00000000000015a0 t ___copy_helper_block_.135 1012 | 00000000000015e7 t ___copy_helper_block_.141 1013 | 00000000000019af t ___copy_helper_block_.161 1014 | 0000000000001f31 t ___copy_helper_block_.191 1015 | 0000000000001f79 t ___copy_helper_block_.195 1016 | 0000000000001f99 t ___copy_helper_block_.201 1017 | 000000000000213d t ___copy_helper_block_.208 1018 | 00000000000025ee t ___copy_helper_block_.227 1019 | 000000000000274c t ___copy_helper_block_.236 1020 | 0000000000002854 t ___copy_helper_block_.247 1021 | 0000000000002ad0 t ___copy_helper_block_.260 1022 | 0000000000002f46 t ___copy_helper_block_.265 1023 | 0000000000002faa t ___copy_helper_block_.271 1024 | 0000000000003057 t ___copy_helper_block_.283 1025 | 000000000000135b t ___copy_helper_block_.64 1026 | 00000000000013a6 t ___copy_helper_block_.95 1027 | 000000000000131f t ___destroy_helper_block_ 1028 | 000000000000144a t ___destroy_helper_block_.104 1029 | 00000000000014e5 t ___destroy_helper_block_.116 1030 | 0000000000001568 t ___destroy_helper_block_.128 1031 | 00000000000015af t ___destroy_helper_block_.136 1032 | 00000000000015f6 t ___destroy_helper_block_.142 1033 | 00000000000019be t ___destroy_helper_block_.162 1034 | 0000000000001f57 t ___destroy_helper_block_.192 1035 | 0000000000001f8b t ___destroy_helper_block_.196 1036 | 0000000000001fbf t ___destroy_helper_block_.202 1037 | 000000000000214c t ___destroy_helper_block_.209 1038 | 00000000000025fd t ___destroy_helper_block_.228 1039 | 000000000000275b t ___destroy_helper_block_.237 1040 | 0000000000002863 t ___destroy_helper_block_.248 1041 | 0000000000002adf t ___destroy_helper_block_.261 1042 | 0000000000002f55 t ___destroy_helper_block_.266 1043 | 0000000000002fb9 t ___destroy_helper_block_.272 1044 | 0000000000003066 t ___destroy_helper_block_.284 1045 | 000000000000136a t ___destroy_helper_block_.65 1046 | 00000000000013cb t ___destroy_helper_block_.96 1047 | 0000000000008648 b __logBlock 1048 | 0000000000008650 b __logLevel 1049 | 0000000000008640 b _allAnimatedImagesWeak 1050 | 0000000000003670 S _kFLAnimatedImageDelayTimeIntervalMinimum 1051 | 00000000000061e0 s l_OBJC_$_CATEGORY_CLASS_METHODS_FLAnimatedImage_$_Logging 1052 | 0000000000006218 s l_OBJC_$_CATEGORY_FLAnimatedImage_$_Logging 1053 | 0000000000005958 s l_OBJC_$_CLASS_METHODS_FLAnimatedImage 1054 | 0000000000006258 s l_OBJC_$_CLASS_METHODS_FLWeakProxy 1055 | 0000000000005a08 s l_OBJC_$_INSTANCE_METHODS_FLAnimatedImage 1056 | 00000000000062c0 s l_OBJC_$_INSTANCE_METHODS_FLWeakProxy 1057 | 0000000000005db8 s l_OBJC_$_INSTANCE_VARIABLES_FLAnimatedImage 1058 | 0000000000006358 s l_OBJC_$_INSTANCE_VARIABLES_FLWeakProxy 1059 | 0000000000006040 s l_OBJC_$_PROP_LIST_FLAnimatedImage 1060 | 0000000000006380 s l_OBJC_$_PROP_LIST_FLWeakProxy 1061 | 0000000000006198 s l_OBJC_CLASS_RO_$_FLAnimatedImage 1062 | 0000000000006398 s l_OBJC_CLASS_RO_$_FLWeakProxy 1063 | 00000000000059c0 s l_OBJC_METACLASS_RO_$_FLAnimatedImage 1064 | 0000000000006278 s l_OBJC_METACLASS_RO_$_FLWeakProxy 1065 | 0000000000003680 s l_switch.table 1066 | 1067 | FLAnimatedImage/libFLAnimatedImage.a(FLAnimatedImageView.o): 1068 | 00000000000016cc t +[FLAnimatedImageView defaultRunLoopMode] 1069 | 00000000000018f6 t -[FLAnimatedImageView .cxx_destruct] 1070 | 000000000000186d t -[FLAnimatedImageView accumulator] 1071 | 00000000000017cf t -[FLAnimatedImageView animatedImage] 1072 | 0000000000000179 t -[FLAnimatedImageView commonInit] 1073 | 0000000000001829 t -[FLAnimatedImageView currentFrameIndex] 1074 | 0000000000001804 t -[FLAnimatedImageView currentFrame] 1075 | 0000000000000392 t -[FLAnimatedImageView dealloc] 1076 | 00000000000003db t -[FLAnimatedImageView didMoveToSuperview] 1077 | 000000000000044e t -[FLAnimatedImageView didMoveToWindow] 1078 | 0000000000000f84 t -[FLAnimatedImageView displayDidRefresh:] 1079 | 0000000000001732 t -[FLAnimatedImageView displayLayer:] 1080 | 0000000000001891 t -[FLAnimatedImageView displayLink] 1081 | 000000000000073f t -[FLAnimatedImageView frameDelayGreatestCommonDivisor] 1082 | 000000000000065f t -[FLAnimatedImageView image] 1083 | 000000000000012d t -[FLAnimatedImageView initWithCoder:] 1084 | 00000000000000be t -[FLAnimatedImageView initWithFrame:] 1085 | 0000000000000000 t -[FLAnimatedImageView initWithImage:] 1086 | 000000000000004c t -[FLAnimatedImageView initWithImage:highlightedImage:] 1087 | 00000000000005aa t -[FLAnimatedImageView intrinsicContentSize] 1088 | 0000000000000d66 t -[FLAnimatedImageView isAnimating] 1089 | 00000000000017e0 t -[FLAnimatedImageView loopCompletionBlock] 1090 | 000000000000184b t -[FLAnimatedImageView loopCountdown] 1091 | 00000000000018d6 t -[FLAnimatedImageView needsDisplayWhenImageBecomesAvailable] 1092 | 00000000000017bc t -[FLAnimatedImageView runLoopMode] 1093 | 000000000000187f t -[FLAnimatedImageView setAccumulator:] 1094 | 00000000000004c1 t -[FLAnimatedImageView setAlpha:] 1095 | 00000000000001d2 t -[FLAnimatedImageView setAnimatedImage:] 1096 | 0000000000001815 t -[FLAnimatedImageView setCurrentFrame:] 1097 | 000000000000183a t -[FLAnimatedImageView setCurrentFrameIndex:] 1098 | 00000000000018a2 t -[FLAnimatedImageView setDisplayLink:] 1099 | 0000000000000534 t -[FLAnimatedImageView setHidden:] 1100 | 0000000000000e33 t -[FLAnimatedImageView setHighlighted:] 1101 | 00000000000006db t -[FLAnimatedImageView setImage:] 1102 | 00000000000017f3 t -[FLAnimatedImageView setLoopCompletionBlock:] 1103 | 000000000000185c t -[FLAnimatedImageView setLoopCountdown:] 1104 | 00000000000018e6 t -[FLAnimatedImageView setNeedsDisplayWhenImageBecomesAvailable:] 1105 | 0000000000000bad t -[FLAnimatedImageView setRunLoopMode:] 1106 | 00000000000018c6 t -[FLAnimatedImageView setShouldAnimate:] 1107 | 00000000000018b6 t -[FLAnimatedImageView shouldAnimate] 1108 | 0000000000000997 t -[FLAnimatedImageView startAnimating] 1109 | 0000000000000cc3 t -[FLAnimatedImageView stopAnimating] 1110 | 0000000000000e99 t -[FLAnimatedImageView updateShouldAnimate] 1111 | 00000000000019a0 S _OBJC_CLASS_$_FLAnimatedImageView 1112 | 0000000000002298 S _OBJC_IVAR_$_FLAnimatedImageView._accumulator 1113 | 0000000000002260 S _OBJC_IVAR_$_FLAnimatedImageView._animatedImage 1114 | 0000000000002280 S _OBJC_IVAR_$_FLAnimatedImageView._currentFrame 1115 | 0000000000002288 S _OBJC_IVAR_$_FLAnimatedImageView._currentFrameIndex 1116 | 0000000000002268 S _OBJC_IVAR_$_FLAnimatedImageView._displayLink 1117 | 0000000000002278 S _OBJC_IVAR_$_FLAnimatedImageView._loopCompletionBlock 1118 | 0000000000002290 S _OBJC_IVAR_$_FLAnimatedImageView._loopCountdown 1119 | 00000000000022a8 S _OBJC_IVAR_$_FLAnimatedImageView._needsDisplayWhenImageBecomesAvailable 1120 | 0000000000002270 S _OBJC_IVAR_$_FLAnimatedImageView._runLoopMode 1121 | 00000000000022a0 S _OBJC_IVAR_$_FLAnimatedImageView._shouldAnimate 1122 | 00000000000019c8 S _OBJC_METACLASS_$_FLAnimatedImageView 1123 | 000000000000152b t ___41-[FLAnimatedImageView displayDidRefresh:]_block_invoke 1124 | 0000000000001572 t ___41-[FLAnimatedImageView displayDidRefresh:]_block_invoke.140 1125 | 000000000000161f t ___41-[FLAnimatedImageView displayDidRefresh:]_block_invoke.162 1126 | 00000000000025b8 s ___block_descriptor_tmp 1127 | 00000000000025e8 s ___block_descriptor_tmp.145 1128 | 0000000000002618 s ___block_descriptor_tmp.167 1129 | 0000000000001554 t ___copy_helper_block_ 1130 | 0000000000001601 t ___copy_helper_block_.143 1131 | 00000000000016ae t ___copy_helper_block_.165 1132 | 0000000000001563 t ___destroy_helper_block_ 1133 | 0000000000001610 t ___destroy_helper_block_.144 1134 | 00000000000016bd t ___destroy_helper_block_.166 1135 | 0000000000002768 s l_OBJC_$_CLASS_METHODS_FLAnimatedImageView 1136 | 00000000000027d0 s l_OBJC_$_INSTANCE_METHODS_FLAnimatedImageView 1137 | 0000000000002bc8 s l_OBJC_$_INSTANCE_VARIABLES_FLAnimatedImageView 1138 | 0000000000002d10 s l_OBJC_$_PROP_LIST_FLAnimatedImageView 1139 | 0000000000002db8 s l_OBJC_CLASS_RO_$_FLAnimatedImageView 1140 | 0000000000002788 s l_OBJC_METACLASS_RO_$_FLAnimatedImageView 1141 | 1142 | libManglePod.a(ManglePod-dummy.o): 1143 | 00000000000000d0 S _OBJC_CLASS_$_PodsDummy_ManglePod 1144 | 00000000000000f8 s _OBJC_LABEL_CLASS_$ 1145 | 00000000000000a8 S _OBJC_METACLASS_$_PodsDummy_ManglePod 1146 | 0000000000000060 s __OBJC_CLASS_RO_$_PodsDummy_ManglePod 1147 | 0000000000000018 s __OBJC_METACLASS_RO_$_PodsDummy_ManglePod 1148 | 1149 | libManglePod.a(SomeClass.o): 1150 | 00000000000000a8 S _$s9ManglePod9SomeClassC10someMethodSiyFTq 1151 | 0000000000000048 S _$s9ManglePod9SomeClassC5valueSivpWvd 1152 | 00000000000000b0 S _$s9ManglePod9SomeClassCACycfCTq 1153 | 0000000000000258 S _$s9ManglePod9SomeClassCMF 1154 | 00000000000000e8 D _$s9ManglePod9SomeClassCML 1155 | 0000000000000020 T _$s9ManglePod9SomeClassCMa 1156 | 00000000000000f0 D _$s9ManglePod9SomeClassCMf 1157 | 00000000000000c0 D _$s9ManglePod9SomeClassCMm 1158 | 0000000000000074 S _$s9ManglePod9SomeClassCMn 1159 | 0000000000000100 D _$s9ManglePod9SomeClassCN 1160 | 0000000000000000 T _$s9ManglePod9SomeClassCfD 1161 | 000000000000005c S _$s9ManglePodMXM 1162 | 00000000000000b8 S ___swift_reflection_version 1163 | 0000000000000278 S __swift_FORCE_LOAD_$_swiftCompatibility50_$_ManglePod 1164 | 0000000000000280 S __swift_FORCE_LOAD_$_swiftCompatibilityDynamicReplacements_$_ManglePod 1165 | 00000000000002a0 s _objc_classes 1166 | 000000000000024e S _symbolic Si 1167 | 0000000000000248 S _symbolic _____ 9ManglePod9SomeClassC 1168 | 0000000000000200 s l__DATA__TtC9ManglePod9SomeClass 1169 | 00000000000001d8 s l__IVARS__TtC9ManglePod9SomeClass 1170 | 0000000000000190 s l__METACLASS_DATA__TtC9ManglePod9SomeClass 1171 | 0000000000000050 s l___unnamed_4 1172 | 0000000000000068 s l___unnamed_5 1173 | 000000000000028c s l_llvm.swift_module_hash 1174 | 0000000000000288 s l_type_metadata_table 1175 | 1176 | libManglePod.a(SomeFoundationClass.o): 1177 | 0000000000000258 S _$s9ManglePod19SomeFoundationClassC10someMethod5flagsSo26SCNetworkReachabilityFlagsVAG_tFTq 1178 | 0000000000000098 D _$s9ManglePod19SomeFoundationClassC5valueSivpWvd 1179 | 0000000000000030 T _$s9ManglePod19SomeFoundationClassCACycfcTo 1180 | 00000000000002f8 S _$s9ManglePod19SomeFoundationClassCMF 1181 | 00000000000000c8 D _$s9ManglePod19SomeFoundationClassCML 1182 | 0000000000000070 T _$s9ManglePod19SomeFoundationClassCMa 1183 | 0000000000000280 S _$s9ManglePod19SomeFoundationClassCMf 1184 | 0000000000000224 S _$s9ManglePod19SomeFoundationClassCMn 1185 | 0000000000000290 S _$s9ManglePod19SomeFoundationClassCN 1186 | 0000000000000000 T _$s9ManglePod19SomeFoundationClassCfD 1187 | 00000000000001fc S _$s9ManglePodMXM 1188 | 0000000000000290 S _OBJC_CLASS_$__TtC9ManglePod19SomeFoundationClass 1189 | 00000000000000a0 D _OBJC_METACLASS_$__TtC9ManglePod19SomeFoundationClass 1190 | 0000000000000260 S ___swift_reflection_version 1191 | 0000000000000318 S __swift_FORCE_LOAD_$_swiftCompatibility50_$_ManglePod 1192 | 0000000000000320 S __swift_FORCE_LOAD_$_swiftCompatibilityDynamicReplacements_$_ManglePod 1193 | 0000000000000350 s _objc_classes 1194 | 0000000000000276 S _symbolic Si 1195 | 0000000000000262 S _symbolic So8NSObjectC 1196 | 0000000000000270 S _symbolic _____ 9ManglePod19SomeFoundationClassC 1197 | 0000000000000198 s l__DATA__TtC9ManglePod19SomeFoundationClass 1198 | 0000000000000150 s l__INSTANCE_METHODS__TtC9ManglePod19SomeFoundationClass 1199 | 0000000000000170 s l__IVARS__TtC9ManglePod19SomeFoundationClass 1200 | 0000000000000108 s l__METACLASS_DATA__TtC9ManglePod19SomeFoundationClass 1201 | 00000000000001f0 s l___unnamed_5 1202 | 0000000000000210 s l___unnamed_6 1203 | 000000000000033c s l_llvm.swift_module_hash 1204 | 0000000000000338 s l_type_metadata_table 1205 | 1206 | libManglePod.a(SomeFunc.o): 1207 | 0000000000000010 S ___swift_reflection_version 1208 | 0000000000000000 S __swift_FORCE_LOAD_$_swiftCompatibility50_$_ManglePod 1209 | 0000000000000008 S __swift_FORCE_LOAD_$_swiftCompatibilityDynamicReplacements_$_ManglePod 1210 | 0000000000000012 s l_llvm.swift_module_hash 1211 | 0000000000000012 S someSwift50Overrides 1212 | 0000000000000012 S someSwiftUI50Overrides 1213 | 1214 | libManglePod.a(SomeStruct.o): 1215 | 0000000000000010 S ___swift_reflection_version 1216 | 0000000000000000 S __swift_FORCE_LOAD_$_swiftCompatibility50_$_ManglePod 1217 | 0000000000000008 S __swift_FORCE_LOAD_$_swiftCompatibilityDynamicReplacements_$_ManglePod 1218 | 0000000000000012 s l_llvm.swift_module_hash 1219 | 1220 | libManglePod.a(BrianSwiftAsyncIntegration.o): 1221 | 0000000000000118 S _OBJC_CLASS_$_BrianSwiftAsyncIntegration 1222 | 00000000000000f0 S _OBJC_METACLASS_$_BrianSwiftAsyncIntegration 1223 | -------------------------------------------------------------------------------- /spec/fixtures/symbols/non_global_defined_symbols.txt: -------------------------------------------------------------------------------- 1 | 2 | PINRemoteImage/libPINRemoteImage.a(FLAnimatedImageView+PINRemoteImage.o): 3 | 0000000000001c60 S l_OBJC_LABEL_PROTOCOL_$_NSObject 4 | 0000000000001c68 S l_OBJC_LABEL_PROTOCOL_$_PINRemoteImageCategory 5 | 0000000000001ba0 D l_OBJC_PROTOCOL_$_NSObject 6 | 0000000000001c00 D l_OBJC_PROTOCOL_$_PINRemoteImageCategory 7 | 8 | PINRemoteImage/libPINRemoteImage.a(NSData+ImageDetectors.o): 9 | 10 | PINRemoteImage/libPINRemoteImage.a(PINButton+PINRemoteImage.o): 11 | 0000000000001c70 S l_OBJC_LABEL_PROTOCOL_$_NSObject 12 | 0000000000001c78 S l_OBJC_LABEL_PROTOCOL_$_PINRemoteImageCategory 13 | 0000000000001bb0 D l_OBJC_PROTOCOL_$_NSObject 14 | 0000000000001c10 D l_OBJC_PROTOCOL_$_PINRemoteImageCategory 15 | 16 | PINRemoteImage/libPINRemoteImage.a(PINDataTaskOperation.o): 17 | 00000000000006b8 S _OBJC_CLASS_$_PINDataTaskOperation 18 | 0000000000000aa8 S _OBJC_IVAR_$_PINDataTaskOperation._dataTask 19 | 0000000000000aa0 S _OBJC_IVAR_$_PINDataTaskOperation._lock 20 | 0000000000000a98 S _OBJC_IVAR_$_PINDataTaskOperation._state 21 | 00000000000006e0 S _OBJC_METACLASS_$_PINDataTaskOperation 22 | 00000000000014d0 S l_OBJC_LABEL_PROTOCOL_$_NSObject 23 | 00000000000014d8 S l_OBJC_LABEL_PROTOCOL_$_NSURLSessionDelegate 24 | 0000000000001410 D l_OBJC_PROTOCOL_$_NSObject 25 | 0000000000001470 D l_OBJC_PROTOCOL_$_NSURLSessionDelegate 26 | 27 | PINRemoteImage/libPINRemoteImage.a(PINImage+DecodedImage.o): 28 | 0000000000000000 T _PINImageJPEGRepresentation 29 | 000000000000000a T _PINImagePNGRepresentation 30 | 00000000000001c0 T _pin_UIImageOrientationFromImageSource 31 | 32 | PINRemoteImage/libPINRemoteImage.a(PINImage+WebP.o): 33 | 34 | PINRemoteImage/libPINRemoteImage.a(PINImageView+PINRemoteImage.o): 35 | 0000000000001c60 S l_OBJC_LABEL_PROTOCOL_$_NSObject 36 | 0000000000001c68 S l_OBJC_LABEL_PROTOCOL_$_PINRemoteImageCategory 37 | 0000000000001ba0 D l_OBJC_PROTOCOL_$_NSObject 38 | 0000000000001c00 D l_OBJC_PROTOCOL_$_PINRemoteImageCategory 39 | 40 | PINRemoteImage/libPINRemoteImage.a(PINProgressiveImage.o): 41 | 0000000000001a30 S _OBJC_CLASS_$_PINProgressiveImage 42 | 0000000000002350 S _OBJC_IVAR_$_PINProgressiveImage._bytesPerSecond 43 | 0000000000002348 S _OBJC_IVAR_$_PINProgressiveImage._currentThreshold 44 | 0000000000002310 S _OBJC_IVAR_$_PINProgressiveImage._estimatedRemainingTimeThreshold 45 | 0000000000002330 S _OBJC_IVAR_$_PINProgressiveImage._expectedNumberOfBytes 46 | 0000000000002300 S _OBJC_IVAR_$_PINProgressiveImage._imageSource 47 | 0000000000002340 S _OBJC_IVAR_$_PINProgressiveImage._isProgressiveJPEG 48 | 0000000000002360 S _OBJC_IVAR_$_PINProgressiveImage._lock 49 | 0000000000002328 S _OBJC_IVAR_$_PINProgressiveImage._mutableData 50 | 0000000000002308 S _OBJC_IVAR_$_PINProgressiveImage._progressThresholds 51 | 0000000000002320 S _OBJC_IVAR_$_PINProgressiveImage._scannedByte 52 | 0000000000002338 S _OBJC_IVAR_$_PINProgressiveImage._size 53 | 0000000000002358 S _OBJC_IVAR_$_PINProgressiveImage._sosCount 54 | 0000000000002318 S _OBJC_IVAR_$_PINProgressiveImage._startTime 55 | 0000000000001a58 S _OBJC_METACLASS_$_PINProgressiveImage 56 | 57 | PINRemoteImage/libPINRemoteImage.a(PINRemoteImage-dummy.o): 58 | 00000000000000d8 S _OBJC_CLASS_$_PodsDummy_PINRemoteImage 59 | 00000000000000b0 S _OBJC_METACLASS_$_PodsDummy_PINRemoteImage 60 | 61 | PINRemoteImage/libPINRemoteImage.a(PINRemoteImageCallbacks.o): 62 | 00000000000004c0 S _OBJC_CLASS_$_PINRemoteImageCallbacks 63 | 0000000000000218 S _OBJC_IVAR_$_PINRemoteImageCallbacks._completionBlock 64 | 0000000000000228 S _OBJC_IVAR_$_PINRemoteImageCallbacks._progressDownloadBlock 65 | 0000000000000220 S _OBJC_IVAR_$_PINRemoteImageCallbacks._progressImageBlock 66 | 0000000000000230 S _OBJC_IVAR_$_PINRemoteImageCallbacks._requestTime 67 | 0000000000000498 S _OBJC_METACLASS_$_PINRemoteImageCallbacks 68 | 69 | PINRemoteImage/libPINRemoteImage.a(PINRemoteImageCategoryManager.o): 70 | 00000000000020b0 S _OBJC_CLASS_$_PINRemoteImageCategoryManager 71 | 0000000000002088 S _OBJC_METACLASS_$_PINRemoteImageCategoryManager 72 | 73 | PINRemoteImage/libPINRemoteImage.a(PINRemoteImageDownloadTask.o): 74 | 00000000000009e0 S _OBJC_CLASS_$_PINRemoteImageDownloadTask 75 | 0000000000000db8 S _OBJC_IVAR_$_PINRemoteImageDownloadTask._canSetDataTaskPriority 76 | 0000000000000dd8 S _OBJC_IVAR_$_PINRemoteImageDownloadTask._hasProgressBlocks 77 | 0000000000000de0 S _OBJC_IVAR_$_PINRemoteImageDownloadTask._progressImage 78 | 0000000000000dd0 S _OBJC_IVAR_$_PINRemoteImageDownloadTask._sessionTaskEndTime 79 | 0000000000000dc8 S _OBJC_IVAR_$_PINRemoteImageDownloadTask._sessionTaskStartTime 80 | 0000000000000dc0 S _OBJC_IVAR_$_PINRemoteImageDownloadTask._urlSessionTaskOperation 81 | 0000000000000a08 S _OBJC_METACLASS_$_PINRemoteImageDownloadTask 82 | 83 | PINRemoteImage/libPINRemoteImage.a(PINRemoteImageManager.o): 84 | 000000000000bf00 S _OBJC_CLASS_$_PINRemoteImageManager 85 | 000000000000bf28 S _OBJC_CLASS_$_PINTaskQOS 86 | 000000000000c038 S _OBJC_IVAR_$_PINRemoteImageManager._authenticationChallengeHandler 87 | 000000000000bff8 S _OBJC_IVAR_$_PINRemoteImageManager._cache 88 | 000000000000bfb0 S _OBJC_IVAR_$_PINRemoteImageManager._callbackQueue 89 | 000000000000c018 S _OBJC_IVAR_$_PINRemoteImageManager._canceledTasks 90 | 000000000000bfc0 S _OBJC_IVAR_$_PINRemoteImageManager._concurrentOperationQueue 91 | 000000000000c028 S _OBJC_IVAR_$_PINRemoteImageManager._estimatedRemainingTimeThreshold 92 | 000000000000bfd0 S _OBJC_IVAR_$_PINRemoteImageManager._highQualityBPSThreshold 93 | 000000000000bfb8 S _OBJC_IVAR_$_PINRemoteImageManager._lock 94 | 000000000000bfd8 S _OBJC_IVAR_$_PINRemoteImageManager._lowQualityBPSThreshold 95 | 000000000000bff0 S _OBJC_IVAR_$_PINRemoteImageManager._maxProgressiveRenderSize 96 | 000000000000c020 S _OBJC_IVAR_$_PINRemoteImageManager._progressThresholds 97 | 000000000000c000 S _OBJC_IVAR_$_PINRemoteImageManager._sessionManager 98 | 000000000000bfe8 S _OBJC_IVAR_$_PINRemoteImageManager._shouldBlurProgressive 99 | 000000000000bfe0 S _OBJC_IVAR_$_PINRemoteImageManager._shouldUpgradeLowQualityImages 100 | 000000000000c030 S _OBJC_IVAR_$_PINRemoteImageManager._taskQOS 101 | 000000000000c010 S _OBJC_IVAR_$_PINRemoteImageManager._tasks 102 | 000000000000c008 S _OBJC_IVAR_$_PINRemoteImageManager._timeout 103 | 000000000000bfc8 S _OBJC_IVAR_$_PINRemoteImageManager._urlSessionTaskQueue 104 | 000000000000c048 S _OBJC_IVAR_$_PINTaskQOS._bytesPerSecond 105 | 000000000000c040 S _OBJC_IVAR_$_PINTaskQOS._endDate 106 | 000000000000bf50 S _OBJC_METACLASS_$_PINRemoteImageManager 107 | 000000000000bf78 S _OBJC_METACLASS_$_PINTaskQOS 108 | 0000000000009b30 S _PINRemoteImageManagerErrorDomain 109 | 0000000000000014 T _dataTaskPriorityWithImageManagerPriority 110 | 0000000000000000 T _operationPriorityWithImageManagerPriority 111 | 000000000000d7a0 S l_OBJC_LABEL_PROTOCOL_$_NSObject 112 | 000000000000d7a8 S l_OBJC_LABEL_PROTOCOL_$_PINURLSessionManagerDelegate 113 | 000000000000d6e0 D l_OBJC_PROTOCOL_$_NSObject 114 | 000000000000d740 D l_OBJC_PROTOCOL_$_PINURLSessionManagerDelegate 115 | 116 | PINRemoteImage/libPINRemoteImage.a(PINRemoteImageManagerResult.o): 117 | 0000000000000a68 S _OBJC_CLASS_$_PINRemoteImageManagerResult 118 | 0000000000000ae8 S _OBJC_IVAR_$_PINRemoteImageManagerResult._UUID 119 | 0000000000000ac8 S _OBJC_IVAR_$_PINRemoteImageManagerResult._animatedImage 120 | 0000000000000ad8 S _OBJC_IVAR_$_PINRemoteImageManagerResult._error 121 | 0000000000000ac0 S _OBJC_IVAR_$_PINRemoteImageManagerResult._image 122 | 0000000000000af0 S _OBJC_IVAR_$_PINRemoteImageManagerResult._renderedImageQuality 123 | 0000000000000ad0 S _OBJC_IVAR_$_PINRemoteImageManagerResult._requestDuration 124 | 0000000000000ae0 S _OBJC_IVAR_$_PINRemoteImageManagerResult._resultType 125 | 0000000000000a90 S _OBJC_METACLASS_$_PINRemoteImageManagerResult 126 | 127 | PINRemoteImage/libPINRemoteImage.a(PINRemoteImageProcessorTask.o): 128 | 0000000000000138 S _OBJC_CLASS_$_PINRemoteImageProcessorTask 129 | 0000000000000220 S _OBJC_IVAR_$_PINRemoteImageProcessorTask._downloadTaskUUID 130 | 0000000000000160 S _OBJC_METACLASS_$_PINRemoteImageProcessorTask 131 | 132 | PINRemoteImage/libPINRemoteImage.a(PINRemoteImageTask.o): 133 | 00000000000008d8 S _OBJC_CLASS_$_PINRemoteImageTask 134 | 0000000000000d30 S _OBJC_IVAR_$_PINRemoteImageTask._callbackBlocks 135 | 0000000000000900 S _OBJC_METACLASS_$_PINRemoteImageTask 136 | 137 | PINRemoteImage/libPINRemoteImage.a(PINRemoteLock.o): 138 | 00000000000001e0 S _OBJC_CLASS_$_PINRemoteLock 139 | 0000000000000238 S _OBJC_IVAR_$_PINRemoteLock._lock 140 | 0000000000000208 S _OBJC_METACLASS_$_PINRemoteLock 141 | 142 | PINRemoteImage/libPINRemoteImage.a(PINURLSessionManager.o): 143 | 00000000000012c8 S _OBJC_CLASS_$_PINURLSessionManager 144 | 0000000000001f80 S _OBJC_IVAR_$_PINURLSessionManager._completions 145 | 0000000000001f58 S _OBJC_IVAR_$_PINURLSessionManager._delegate 146 | 0000000000001f78 S _OBJC_IVAR_$_PINURLSessionManager._delegateQueues 147 | 0000000000001f70 S _OBJC_IVAR_$_PINURLSessionManager._operationQueue 148 | 0000000000001f68 S _OBJC_IVAR_$_PINURLSessionManager._session 149 | 0000000000001f60 S _OBJC_IVAR_$_PINURLSessionManager._sessionManagerLock 150 | 00000000000012f0 S _OBJC_METACLASS_$_PINURLSessionManager 151 | 0000000000003120 S l_OBJC_LABEL_PROTOCOL_$_NSObject 152 | 0000000000003138 S l_OBJC_LABEL_PROTOCOL_$_NSURLSessionDataDelegate 153 | 0000000000003128 S l_OBJC_LABEL_PROTOCOL_$_NSURLSessionDelegate 154 | 0000000000003130 S l_OBJC_LABEL_PROTOCOL_$_NSURLSessionTaskDelegate 155 | 0000000000002fa0 D l_OBJC_PROTOCOL_$_NSObject 156 | 00000000000030c0 D l_OBJC_PROTOCOL_$_NSURLSessionDataDelegate 157 | 0000000000003000 D l_OBJC_PROTOCOL_$_NSURLSessionDelegate 158 | 0000000000003060 D l_OBJC_PROTOCOL_$_NSURLSessionTaskDelegate 159 | 160 | FLAnimatedImage/libFLAnimatedImage.a(FLAnimatedImage-dummy.o): 161 | 00000000000000d8 S _OBJC_CLASS_$_PodsDummy_FLAnimatedImage 162 | 00000000000000b0 S _OBJC_METACLASS_$_PodsDummy_FLAnimatedImage 163 | 164 | FLAnimatedImage/libFLAnimatedImage.a(FLAnimatedImage.o): 165 | 00000000000042f8 S _OBJC_CLASS_$_FLAnimatedImage 166 | 0000000000004320 S _OBJC_CLASS_$_FLWeakProxy 167 | 00000000000042c8 S _OBJC_IVAR_$_FLAnimatedImage._allFramesIndexSet 168 | 0000000000004278 S _OBJC_IVAR_$_FLAnimatedImage._cachedFrameIndexes 169 | 0000000000004270 S _OBJC_IVAR_$_FLAnimatedImage._cachedFramesForIndexes 170 | 0000000000004260 S _OBJC_IVAR_$_FLAnimatedImage._data 171 | 00000000000042b0 S _OBJC_IVAR_$_FLAnimatedImage._delayTimesForIndexes 172 | 0000000000004250 S _OBJC_IVAR_$_FLAnimatedImage._frameCacheSizeMax 173 | 0000000000004258 S _OBJC_IVAR_$_FLAnimatedImage._frameCacheSizeMaxInternal 174 | 00000000000042c0 S _OBJC_IVAR_$_FLAnimatedImage._frameCacheSizeOptimal 175 | 00000000000042b8 S _OBJC_IVAR_$_FLAnimatedImage._frameCount 176 | 0000000000004288 S _OBJC_IVAR_$_FLAnimatedImage._imageSource 177 | 0000000000004290 S _OBJC_IVAR_$_FLAnimatedImage._loopCount 178 | 00000000000042e8 S _OBJC_IVAR_$_FLAnimatedImage._memoryWarningCount 179 | 0000000000004298 S _OBJC_IVAR_$_FLAnimatedImage._posterImage 180 | 00000000000042a8 S _OBJC_IVAR_$_FLAnimatedImage._posterImageFrameIndex 181 | 0000000000004268 S _OBJC_IVAR_$_FLAnimatedImage._predrawingEnabled 182 | 00000000000042e0 S _OBJC_IVAR_$_FLAnimatedImage._requestedFrameIndex 183 | 0000000000004280 S _OBJC_IVAR_$_FLAnimatedImage._requestedFrameIndexes 184 | 00000000000042d8 S _OBJC_IVAR_$_FLAnimatedImage._serialQueue 185 | 00000000000042a0 S _OBJC_IVAR_$_FLAnimatedImage._size 186 | 00000000000042d0 S _OBJC_IVAR_$_FLAnimatedImage._weakProxy 187 | 00000000000042f0 S _OBJC_IVAR_$_FLWeakProxy._target 188 | 0000000000004348 S _OBJC_METACLASS_$_FLAnimatedImage 189 | 0000000000004370 S _OBJC_METACLASS_$_FLWeakProxy 190 | 0000000000003670 S _kFLAnimatedImageDelayTimeIntervalMinimum 191 | 192 | FLAnimatedImage/libFLAnimatedImage.a(FLAnimatedImageView.o): 193 | 00000000000019a0 S _OBJC_CLASS_$_FLAnimatedImageView 194 | 0000000000002298 S _OBJC_IVAR_$_FLAnimatedImageView._accumulator 195 | 0000000000002260 S _OBJC_IVAR_$_FLAnimatedImageView._animatedImage 196 | 0000000000002280 S _OBJC_IVAR_$_FLAnimatedImageView._currentFrame 197 | 0000000000002288 S _OBJC_IVAR_$_FLAnimatedImageView._currentFrameIndex 198 | 0000000000002268 S _OBJC_IVAR_$_FLAnimatedImageView._displayLink 199 | 0000000000002278 S _OBJC_IVAR_$_FLAnimatedImageView._loopCompletionBlock 200 | 0000000000002290 S _OBJC_IVAR_$_FLAnimatedImageView._loopCountdown 201 | 00000000000022a8 S _OBJC_IVAR_$_FLAnimatedImageView._needsDisplayWhenImageBecomesAvailable 202 | 0000000000002270 S _OBJC_IVAR_$_FLAnimatedImageView._runLoopMode 203 | 00000000000022a0 S _OBJC_IVAR_$_FLAnimatedImageView._shouldAnimate 204 | 00000000000019c8 S _OBJC_METACLASS_$_FLAnimatedImageView 205 | 206 | libManglePod.a(ManglePod-dummy.o): 207 | 00000000000000d0 S _OBJC_CLASS_$_PodsDummy_ManglePod 208 | 00000000000000a8 S _OBJC_METACLASS_$_PodsDummy_ManglePod 209 | 210 | libManglePod.a(SomeClass.o): 211 | 00000000000000a8 S _$s9ManglePod9SomeClassC10someMethodSiyFTq 212 | 0000000000000048 S _$s9ManglePod9SomeClassC5valueSivpWvd 213 | 00000000000000b0 S _$s9ManglePod9SomeClassCACycfCTq 214 | 0000000000000258 S _$s9ManglePod9SomeClassCMF 215 | 00000000000000e8 D _$s9ManglePod9SomeClassCML 216 | 0000000000000020 T _$s9ManglePod9SomeClassCMa 217 | 00000000000000f0 D _$s9ManglePod9SomeClassCMf 218 | 00000000000000c0 D _$s9ManglePod9SomeClassCMm 219 | 0000000000000074 S _$s9ManglePod9SomeClassCMn 220 | 0000000000000100 D _$s9ManglePod9SomeClassCN 221 | 0000000000000000 T _$s9ManglePod9SomeClassCfD 222 | 000000000000005c S _$s9ManglePodMXM 223 | 00000000000000b8 S ___swift_reflection_version 224 | 0000000000000278 S __swift_FORCE_LOAD_$_swiftCompatibility50_$_ManglePod 225 | 0000000000000280 S __swift_FORCE_LOAD_$_swiftCompatibilityDynamicReplacements_$_ManglePod 226 | 000000000000024e S _symbolic Si 227 | 0000000000000248 S _symbolic _____ 9ManglePod9SomeClassC 228 | 0000000000000000 T _globalinit_33_A313450CFC1FC3D0CBEF4411412DB9E8_func0 229 | 230 | libManglePod.a(SomeFoundationClass.o): 231 | 0000000000000258 S _$s9ManglePod19SomeFoundationClassC10someMethod5flagsSo26SCNetworkReachabilityFlagsVAG_tFTq 232 | 0000000000000098 D _$s9ManglePod19SomeFoundationClassC5valueSivpWvd 233 | 0000000000000030 T _$s9ManglePod19SomeFoundationClassCACycfcTo 234 | 00000000000002f8 S _$s9ManglePod19SomeFoundationClassCMF 235 | 00000000000000c8 D _$s9ManglePod19SomeFoundationClassCML 236 | 0000000000000070 T _$s9ManglePod19SomeFoundationClassCMa 237 | 0000000000000280 S _$s9ManglePod19SomeFoundationClassCMf 238 | 0000000000000224 S _$s9ManglePod19SomeFoundationClassCMn 239 | 0000000000000290 S _$s9ManglePod19SomeFoundationClassCN 240 | 0000000000000000 T _$s9ManglePod19SomeFoundationClassCfD 241 | 00000000000001fc S _$s9ManglePodMXM 242 | 0000000000000290 S _OBJC_CLASS_$__TtC9ManglePod19SomeFoundationClass 243 | 00000000000000a0 D _OBJC_METACLASS_$__TtC9ManglePod19SomeFoundationClass 244 | 0000000000000260 S ___swift_reflection_version 245 | 0000000000000318 S __swift_FORCE_LOAD_$_swiftCompatibility50_$_ManglePod 246 | 0000000000000320 S __swift_FORCE_LOAD_$_swiftCompatibilityDynamicReplacements_$_ManglePod 247 | 0000000000000276 S _symbolic Si 248 | 0000000000000262 S _symbolic So8NSObjectC 249 | 0000000000000270 S _symbolic _____ 9ManglePod19SomeFoundationClassC 250 | 251 | libManglePod.a(SomeFunc.o): 252 | 0000000000000010 S ___swift_reflection_version 253 | 0000000000000000 S __swift_FORCE_LOAD_$_swiftCompatibility50_$_ManglePod 254 | 0000000000000008 S __swift_FORCE_LOAD_$_swiftCompatibilityDynamicReplacements_$_ManglePod 255 | 0000000000000012 S __swift_someSwift50Overrides 256 | 0000000000000012 S __swift_someSwiftUI50Overrides 257 | 258 | libManglePod.a(SomeStruct.o): 259 | 0000000000000010 S ___swift_reflection_version 260 | 0000000000000000 S __swift_FORCE_LOAD_$_swiftCompatibility50_$_ManglePod 261 | 0000000000000008 S __swift_FORCE_LOAD_$_swiftCompatibilityDynamicReplacements_$_ManglePod 262 | 263 | libManglePod.a(BrianSwiftAsyncIntegration.o): 264 | 0000000000000118 S _OBJC_CLASS_$_BrianSwiftAsyncIntegration 265 | 00000000000000f0 S _OBJC_METACLASS_$_BrianSwiftAsyncIntegration 266 | -------------------------------------------------------------------------------- /spec/integration/integration_spec.rb: -------------------------------------------------------------------------------- 1 | require File.expand_path('../../spec_helper', __FILE__) 2 | require 'tmpdir' 3 | require 'cocoapods_mangle/config' 4 | 5 | def defines_from_xcconfig(xcconfig_path) 6 | xcconfig = Xcodeproj::Config.new(File.new(xcconfig_path)).to_hash 7 | xcconfig[CocoapodsMangle::Config::MANGLING_DEFINES_XCCONFIG_KEY].split(' ') 8 | end 9 | 10 | def build_sample 11 | `xcodebuild -workspace "Mangle Integration.xcworkspace" -scheme "Mangle Integration" -sdk iphonesimulator build` 12 | $?.success? 13 | end 14 | 15 | RSpec.shared_examples 'mangling integration' do 16 | it 'installs and mangles all expected symbols' do 17 | Dir.chdir project_dir 18 | 19 | # Calling the command directly here rather than through the Ruby API 20 | # because the CocoaPods Ruby API seems to keep some state between installs 21 | `bundle exec pod install` 22 | pod_install_success = $?.success? 23 | expect(pod_install_success).to be_truthy 24 | 25 | xcconfig_path = File.join(project_dir, "Pods/Target Support Files/#{CocoapodsMangle::NAME}.xcconfig") 26 | expect(defines_from_xcconfig(xcconfig_path)).to match_array(expected_defines) 27 | expect(build_sample).to be_truthy 28 | end 29 | end 30 | 31 | describe CocoapodsMangle do 32 | let(:tmp_dir) { Dir.mktmpdir } 33 | let(:project_dir) { File.join(tmp_dir, 'project') } 34 | let(:pod_dir) { File.join(tmp_dir, 'pod') } 35 | 36 | before(:each) do 37 | fixtures_dir = File.expand_path("#{File.dirname(__FILE__)}/../fixtures") 38 | FileUtils.copy_entry(File.join(fixtures_dir, 'project'), project_dir) 39 | FileUtils.copy_entry(File.join(fixtures_dir, podpsec_fixture_dir), pod_dir) 40 | File.open(File.join(project_dir, 'Podfile'), 'w') do |podfile| 41 | podfile.write(podfile_contents) 42 | end 43 | end 44 | 45 | context "with a Swift pod" do 46 | let(:podpsec_fixture_dir) { "swift-pod" } 47 | 48 | context 'without frameworks' do 49 | let(:podfile_contents) do 50 | <<~PODFILE 51 | platform :ios, '10.0' 52 | plugin 'cocoapods-mangle' 53 | target 'Mangle Integration' do 54 | pod 'ManglePod', path: '../pod' 55 | pod 'lottie-ios' 56 | end 57 | PODFILE 58 | end 59 | let(:expected_defines) do 60 | %w[ 61 | PodsDummy_ManglePod=Mangle_Integration_PodsDummy_ManglePod 62 | PodsDummy_lottie_ios=Mangle_Integration_PodsDummy_lottie_ios 63 | ] 64 | end 65 | 66 | include_examples 'mangling integration' 67 | end 68 | 69 | context 'with frameworks' do 70 | let(:podfile_contents) do 71 | <<~PODFILE 72 | platform :ios, '10.0' 73 | use_frameworks! 74 | plugin 'cocoapods-mangle' 75 | target 'Mangle Integration' do 76 | pod 'ManglePod', path: '../pod' 77 | end 78 | PODFILE 79 | end 80 | let(:expected_defines) do 81 | %w[ 82 | ManglePodVersionNumber=Mangle_Integration_ManglePodVersionNumber 83 | ManglePodVersionString=Mangle_Integration_ManglePodVersionString 84 | PodsDummy_ManglePod=Mangle_Integration_PodsDummy_ManglePod 85 | ] 86 | end 87 | 88 | include_examples 'mangling integration' 89 | end 90 | end 91 | 92 | context "with an Objective-C pod" do 93 | let(:podpsec_fixture_dir) { "objc-pod" } 94 | 95 | context 'without frameworks' do 96 | let(:podfile_contents) do 97 | <<~PODFILE 98 | platform :ios, '10.0' 99 | plugin 'cocoapods-mangle' 100 | target 'Mangle Integration' do 101 | pod 'ManglePod', path: '../pod' 102 | end 103 | PODFILE 104 | end 105 | let(:expected_defines) do 106 | %w[ 107 | PodsDummy_ManglePod=Mangle_Integration_PodsDummy_ManglePod 108 | CPMObject=Mangle_Integration_CPMObject 109 | CPMConstant=Mangle_Integration_CPMConstant 110 | CPMStringFromIntegerFunction=Mangle_Integration_CPMStringFromIntegerFunction 111 | cpm_doSomethingWithoutParams=Mangle_Integration_cpm_doSomethingWithoutParams 112 | cpm_doSomethingWithParam=Mangle_Integration_cpm_doSomethingWithParam 113 | ] 114 | end 115 | 116 | include_examples 'mangling integration' 117 | end 118 | 119 | context 'with frameworks' do 120 | let(:podfile_contents) do 121 | <<~PODFILE 122 | platform :ios, '10.0' 123 | use_frameworks! 124 | plugin 'cocoapods-mangle' 125 | target 'Mangle Integration' do 126 | pod 'ManglePod', path: '../pod' 127 | end 128 | PODFILE 129 | end 130 | let(:expected_defines) do 131 | %w[ 132 | ManglePodVersionNumber=Mangle_Integration_ManglePodVersionNumber 133 | ManglePodVersionString=Mangle_Integration_ManglePodVersionString 134 | PodsDummy_ManglePod=Mangle_Integration_PodsDummy_ManglePod 135 | CPMObject=Mangle_Integration_CPMObject 136 | CPMConstant=Mangle_Integration_CPMConstant 137 | CPMStringFromIntegerFunction=Mangle_Integration_CPMStringFromIntegerFunction 138 | cpm_doSomethingWithoutParams=Mangle_Integration_cpm_doSomethingWithoutParams 139 | cpm_doSomethingWithParam=Mangle_Integration_cpm_doSomethingWithParam 140 | ] 141 | end 142 | 143 | include_examples 'mangling integration' 144 | end 145 | end 146 | end 147 | -------------------------------------------------------------------------------- /spec/spec_helper.rb: -------------------------------------------------------------------------------- 1 | require 'cocoapods' 2 | 3 | module Pod 4 | # Overrides logging so it does not pollute the tests 5 | # 6 | module UI 7 | class << self 8 | def puts(message = '') end 9 | 10 | def print(message) end 11 | end 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /spec/unit/builder_spec.rb: -------------------------------------------------------------------------------- 1 | require File.expand_path('../../spec_helper', __FILE__) 2 | require 'cocoapods_mangle/builder' 3 | 4 | describe CocoapodsMangle::Builder do 5 | let(:pods_project_path) { 'path/to/Pods.xcodeproj' } 6 | let(:pod_target_labels) { %w[Pod-A Pod-B] } 7 | let(:subject) { CocoapodsMangle::Builder.new(pods_project_path, pod_target_labels) } 8 | 9 | context '.build!' do 10 | before do 11 | allow(FileUtils).to receive(:remove_dir).with(CocoapodsMangle::Builder::BUILD_DIR, true) 12 | end 13 | 14 | it 'builds' do 15 | expect(FileUtils).to receive(:remove_dir).with(CocoapodsMangle::Builder::BUILD_DIR, true) 16 | expect(subject).to receive(:build_target).with('Pod-A') 17 | expect(subject).to receive(:build_target).with('Pod-B') 18 | subject.build! 19 | end 20 | end 21 | 22 | context '.binaries_to_mangle' do 23 | let(:static_binaries) { %w[path/to/staticA.a path/to/staticB.a] } 24 | let(:frameworks) { %w[path/to/FrameworkA.framework path/to/FrameworkB.framework] } 25 | let(:framework_binaries) do 26 | frameworks.map { |path| "#{path}/#{File.basename(path, '.framework')}" } 27 | end 28 | before do 29 | allow(Dir).to receive(:glob) 30 | .with("#{CocoapodsMangle::Builder::BUILT_PRODUCTS_DIR}/**/*.a") 31 | .and_return(static_binaries + ['path/to/libPods-A.a']) 32 | allow(Dir).to receive(:glob) 33 | .with("#{CocoapodsMangle::Builder::BUILT_PRODUCTS_DIR}/**/*.framework") 34 | .and_return(frameworks + ['path/to/Pods_A.framework']) 35 | end 36 | 37 | it 'gives the static and framework binaries' do 38 | binaries = static_binaries + framework_binaries 39 | expect(subject.binaries_to_mangle).to match_array(binaries) 40 | end 41 | end 42 | end 43 | -------------------------------------------------------------------------------- /spec/unit/config_spec.rb: -------------------------------------------------------------------------------- 1 | require File.expand_path('../../spec_helper', __FILE__) 2 | require 'cocoapods_mangle/config' 3 | 4 | describe CocoapodsMangle::Config do 5 | let(:context) do 6 | instance_double('Mangle context', 7 | xcconfig_path: 'path/to/mangle.xcconfig', 8 | pod_target_labels: ['Pods-A'], 9 | pods_project_path: 'path/to/Pods.xcodeproj', 10 | mangle_prefix: 'prefix_', 11 | specs_checksum: 'checksum', 12 | pod_xcconfig_paths: ['path/to/A.xcconfig', 'path/to/B.xcconfig']) 13 | end 14 | let(:subject) do 15 | CocoapodsMangle::Config.new(context) 16 | end 17 | 18 | context '.update_mangling!' do 19 | let(:xcconfig_file) { double('config') } 20 | let(:binaries_to_mangle) { ['binary_A', 'binary_B'] } 21 | let(:mangling_defines) { ['A=B', 'C=D'] } 22 | let(:builder) { double('builder') } 23 | 24 | before do 25 | allow(CocoapodsMangle::Builder).to receive(:new).with(context.pods_project_path, context.pod_target_labels).and_return(builder) 26 | allow(builder).to receive(:build!) 27 | allow(builder).to receive(:binaries_to_mangle).and_return(binaries_to_mangle) 28 | allow(CocoapodsMangle::Defines).to receive(:mangling_defines).with(context.mangle_prefix, binaries_to_mangle).and_return(mangling_defines) 29 | allow(File).to receive(:open).and_call_original 30 | allow(File).to receive(:open).with(context.xcconfig_path, 'w').and_yield(xcconfig_file) 31 | end 32 | 33 | it 'updates mangling' do 34 | expect(builder).to receive(:build!) 35 | xcconfig_contents = '' 36 | expect(xcconfig_file).to receive(:write) { |arg| xcconfig_contents = arg } 37 | 38 | subject.update_mangling! 39 | 40 | expect(xcconfig_contents).to include("MANGLING_DEFINES = #{mangling_defines.join(" ")}") 41 | expect(xcconfig_contents).to include('MANGLED_SPECS_CHECKSUM = checksum') 42 | end 43 | end 44 | 45 | context '.needs_update?' do 46 | let(:xcconfig_file) { double('config file') } 47 | let(:xcodeproj_config) { double('xcodeproj config') } 48 | let(:xcconfig_specs_checksum) { 'checksum' } 49 | 50 | before do 51 | allow(File).to receive(:exist?).and_call_original 52 | allow(File).to receive(:exist?).with(context.xcconfig_path).and_return(true) 53 | allow(File).to receive(:new).and_call_original 54 | allow(File).to receive(:new).with(context.xcconfig_path).and_return(xcconfig_file) 55 | allow(Xcodeproj::Config).to receive(:new).with(xcconfig_file).and_return(xcodeproj_config) 56 | allow(xcodeproj_config).to receive(:to_hash).and_return('MANGLING_DEFINES' => 'A=B C=D', 57 | 'MANGLED_SPECS_CHECKSUM' => "#{xcconfig_specs_checksum}") 58 | end 59 | 60 | context 'equal checksums' do 61 | before do 62 | allow(context).to receive(:specs_checksum).and_return('checksum') 63 | end 64 | 65 | it 'does not need an update' do 66 | expect(subject.needs_update?).to eq(false) 67 | end 68 | end 69 | 70 | context 'different checksums' do 71 | before do 72 | allow(context).to receive(:specs_checksum).and_return('other_checksum') 73 | end 74 | 75 | it 'needs an update' do 76 | expect(subject.needs_update?).to eq(true) 77 | end 78 | end 79 | 80 | context 'no config' do 81 | before do 82 | allow(File).to receive(:exist?).with(context.xcconfig_path).and_return(false) 83 | end 84 | 85 | it 'needs an update' do 86 | expect(subject.needs_update?).to eq(true) 87 | end 88 | end 89 | end 90 | 91 | context '.update_pod_xcconfigs_for_mangling!' do 92 | it 'updates each unique config' do 93 | context.pod_xcconfig_paths.each do |pod_xcconfig| 94 | expect(subject).to receive(:update_pod_xcconfig_for_mangling!).with(pod_xcconfig) 95 | end 96 | subject.update_pod_xcconfigs_for_mangling! 97 | end 98 | end 99 | 100 | context '.update_pod_xcconfig_for_mangling!' do 101 | let(:pod_xcconfig_path) { '/path/to/pod.xcconfig' } 102 | let(:pod_xcconfig_content) { "GCC_PREPROCESSOR_DEFINITIONS = A=B\nKEY = VALUE" } 103 | let(:pod_xcconfig_file) { double('pod_config') } 104 | 105 | before do 106 | allow(File).to receive(:readlines).and_call_original 107 | allow(File).to receive(:readlines).and_return(pod_xcconfig_content.split("\n")) 108 | allow(File).to receive(:read).and_call_original 109 | allow(File).to receive(:read).and_return(pod_xcconfig_content) 110 | allow(File).to receive(:open).and_call_original 111 | allow(File).to receive(:open).with(pod_xcconfig_path, 'w').and_yield(pod_xcconfig_file) 112 | end 113 | 114 | it 'updates the pod config' do 115 | pod_xcconfig_contents = '' 116 | expect(pod_xcconfig_file).to receive(:write) { |arg| pod_xcconfig_contents = arg } 117 | subject.update_pod_xcconfig_for_mangling!(pod_xcconfig_path) 118 | expect(pod_xcconfig_contents).to eq("#include \"#{context.xcconfig_path}\"\nGCC_PREPROCESSOR_DEFINITIONS = A=B $(MANGLING_DEFINES)\nKEY = VALUE") 119 | end 120 | end 121 | end 122 | -------------------------------------------------------------------------------- /spec/unit/context_spec.rb: -------------------------------------------------------------------------------- 1 | require File.expand_path('../../spec_helper', __FILE__) 2 | require 'cocoapods_mangle/context' 3 | 4 | describe CocoapodsMangle::Context do 5 | let(:umbrella_targets) do 6 | [ 7 | instance_double('umbrella target A', cocoapods_target_label: 'Pods-A', user_targets: [instance_double('target A', name: 'A')]), 8 | instance_double('umbrella target B', cocoapods_target_label: 'Pods-B', user_targets: [instance_double('target B', name: 'B')]), 9 | instance_double('umbrella target C', cocoapods_target_label: 'Pods-C', user_targets: [instance_double('target C', name: 'C')]) 10 | ] 11 | end 12 | let(:installer_context) { instance_double('installer context', umbrella_targets: umbrella_targets) } 13 | let(:options) { {} } 14 | let(:subject) { CocoapodsMangle::Context.new(installer_context, options) } 15 | 16 | context '.xcconfig_path' do 17 | before do 18 | allow(installer_context).to receive_message_chain(:sandbox, :target_support_files_root).and_return( Pathname.new('/support_files') ) 19 | allow(installer_context).to receive_message_chain(:sandbox, :root, :parent).and_return( Pathname.new('/parent') ) 20 | end 21 | 22 | context 'No options' do 23 | it 'gives the default xcconfig path' do 24 | expect(subject.xcconfig_path).to eq("/support_files/#{CocoapodsMangle::NAME}.xcconfig") 25 | end 26 | end 27 | 28 | context 'User provided xcconfig path' do 29 | let(:options) { { xcconfig_path: 'path/to/mangle.xcconfig' } } 30 | it 'gives the user xcconfig path, relative to the project' do 31 | expect(subject.xcconfig_path).to eq("/parent/#{options[:xcconfig_path]}") 32 | end 33 | end 34 | end 35 | 36 | context '.mangle_prefix' do 37 | context 'No options' do 38 | before do 39 | allow(umbrella_targets.first).to receive_message_chain(:user_project, :path).and_return('path/to/Project.xcodeproj') 40 | end 41 | 42 | it 'gives the project name as the prefix' do 43 | expect(subject.mangle_prefix).to eq('Project_') 44 | end 45 | end 46 | 47 | context 'No options with space in project name' do 48 | before do 49 | allow(umbrella_targets.first).to receive_message_chain(:user_project, :path).and_return('path/to/Project Name.xcodeproj') 50 | end 51 | 52 | it 'gives the project name with underscores as the prefix' do 53 | expect(subject.mangle_prefix).to eq('Project_Name_') 54 | end 55 | end 56 | 57 | context 'User provided prefix' do 58 | let(:options) { { mangle_prefix: 'Prefix_' } } 59 | 60 | it 'gives the user prefix' do 61 | expect(subject.mangle_prefix).to eq(options[:mangle_prefix]) 62 | end 63 | end 64 | end 65 | 66 | context '.pods_project_path' do 67 | let(:pods_project) { instance_double('pods project', path: 'path/to/Pods.xcodeproj') } 68 | 69 | before do 70 | allow(installer_context).to receive(:pods_project).and_return(pods_project) 71 | end 72 | 73 | it 'gives the project path' do 74 | expect(subject.pods_project_path).to eq(pods_project.path) 75 | end 76 | end 77 | 78 | context '.pod_target_labels' do 79 | context 'No options' do 80 | it 'gives all targets' do 81 | expect(subject.pod_target_labels).to eq(['Pods-A', 'Pods-B', 'Pods-C']) 82 | end 83 | end 84 | 85 | context 'With targets' do 86 | let(:options) { { targets: ['A', 'B'] } } 87 | it 'gives only requested targets' do 88 | expect(subject.pod_target_labels).to eq(['Pods-A', 'Pods-B']) 89 | end 90 | end 91 | end 92 | 93 | context '.pod_xcconfig_paths' do 94 | let(:pods_project) { instance_double('pods project', path: 'path/to/Pods.xcodeproj') } 95 | let(:pod_target) { double('target') } 96 | let(:debug_build_configuration) { double('debug') } 97 | let(:release_build_configuration) { double('release') } 98 | 99 | before do 100 | allow(installer_context).to receive(:pods_project).and_return(pods_project) 101 | allow(pods_project).to receive(:targets).and_return([pod_target]) 102 | build_configurations = [debug_build_configuration, release_build_configuration] 103 | allow(pod_target).to receive(:build_configurations).and_return(build_configurations) 104 | build_configurations.each do |config| 105 | allow(config).to receive_message_chain(:base_configuration_reference, :real_path).and_return('path/to/pod.xcconfig') 106 | end 107 | end 108 | 109 | it 'gives the pod xcconfigs' do 110 | expect(subject.pod_xcconfig_paths).to eq(['path/to/pod.xcconfig']) 111 | end 112 | end 113 | 114 | context '.specs_checksum' do 115 | let(:gem_summary) { "#{CocoapodsMangle::NAME}=#{CocoapodsMangle::VERSION}" } 116 | let(:spec_A) { instance_double('Spec A', checksum: 'checksum_A') } 117 | let(:spec_B) { instance_double('Spec B', checksum: 'checksum_B') } 118 | let(:options) { { targets: ['A'] } } 119 | 120 | before do 121 | allow(umbrella_targets.first).to receive(:specs).and_return([spec_A, spec_B]) 122 | end 123 | 124 | it 'gives the checksum' do 125 | summary = "#{gem_summary},checksum_A,checksum_B" 126 | expect(subject.specs_checksum).to eq(Digest::SHA1.hexdigest(summary)) 127 | end 128 | end 129 | end 130 | -------------------------------------------------------------------------------- /spec/unit/defines_spec.rb: -------------------------------------------------------------------------------- 1 | require File.expand_path('../../spec_helper', __FILE__) 2 | require 'cocoapods_mangle/defines' 3 | 4 | describe CocoapodsMangle::Defines do 5 | let(:non_global_defined_symbols) do 6 | File.read("#{File.dirname(__FILE__)}/../fixtures/symbols/non_global_defined_symbols.txt").split("\n") 7 | end 8 | let(:all_defined_symbols) do 9 | File.read("#{File.dirname(__FILE__)}/../fixtures/symbols/all_defined_symbols.txt").split("\n") 10 | end 11 | let(:defines) { CocoapodsMangle::Defines.mangling_defines('Prefix_', ['A.a', 'B.a']) } 12 | 13 | before do 14 | allow(CocoapodsMangle::Defines).to receive(:run_nm).with(['A.a', 'B.a'], '-gU').and_return(non_global_defined_symbols) 15 | allow(CocoapodsMangle::Defines).to receive(:run_nm).with(['A.a', 'B.a'], '-U').and_return(all_defined_symbols) 16 | end 17 | 18 | context 'Class mangling' do 19 | let(:expected_classes) do 20 | %w[ 21 | PINDataTaskOperation 22 | PINProgressiveImage 23 | PodsDummy_ManglePod 24 | PodsDummy_PINRemoteImage 25 | PINRemoteImageCallbacks 26 | PINRemoteImageCategoryManager 27 | PINRemoteImageDownloadTask 28 | PINRemoteImageManager 29 | PINTaskQOS 30 | PINRemoteImageManagerResult 31 | PINRemoteImageProcessorTask 32 | PINRemoteImageTask 33 | PINRemoteLock 34 | PINURLSessionManager 35 | FLAnimatedImage 36 | FLWeakProxy 37 | FLAnimatedImageView 38 | BrianSwiftAsyncIntegration 39 | ] 40 | end 41 | 42 | it 'should mangle the classes' do 43 | expected_classes.each do |class_name| 44 | expect(defines).to include("#{class_name}=Prefix_#{class_name}") 45 | end 46 | end 47 | end 48 | 49 | context 'Constant mangling' do 50 | let(:expected_constants) do 51 | %w[ 52 | PINRemoteImageManagerErrorDomain 53 | PINImageJPEGRepresentation 54 | PINImagePNGRepresentation 55 | pin_UIImageOrientationFromImageSource 56 | dataTaskPriorityWithImageManagerPriority 57 | operationPriorityWithImageManagerPriority 58 | kFLAnimatedImageDelayTimeIntervalMinimum 59 | ] 60 | end 61 | 62 | it 'should mangle the constants' do 63 | expected_constants.each do |const| 64 | expect(defines).to include("#{const}=Prefix_#{const}") 65 | end 66 | end 67 | end 68 | 69 | context 'Category selector mangling' do 70 | let(:expected_non_property_selectors) do 71 | %w[ 72 | pin_cancelImageDownload 73 | pin_clearImages 74 | pin_downloadImageOperationUUID 75 | pin_ignoreGIFs 76 | pin_setDownloadImageOperationUUID 77 | pin_setImageFromURL 78 | pin_setImageFromURLs 79 | pin_setPlaceholderWithImage 80 | pin_updateUIWithImage 81 | pin_isGIF 82 | pin_decodedImageWithCGImageRef 83 | pin_decodedImageWithData 84 | pin_addOperationWithQueuePriority 85 | ] 86 | end 87 | let(:mangled_class_non_property_selectors) do 88 | %w[ 89 | logStringFromBlock 90 | setLogBlock 91 | ] 92 | end 93 | 94 | it 'should mangle the category selectors' do 95 | expected_non_property_selectors.each do |sel| 96 | expect(defines).to include("#{sel}=Prefix_#{sel}") 97 | end 98 | end 99 | 100 | it 'should not mangle the category selectors on mangled classes' do 101 | mangled_class_non_property_selectors.each do |sel| 102 | expect(defines).not_to include("#{sel}=Prefix_#{sel}") 103 | end 104 | end 105 | 106 | it 'should mangle the category property selectors' do 107 | expect(defines).to include('pin_updateWithProgress=Prefix_pin_updateWithProgress') 108 | expect(defines).to include('setPin_updateWithProgress=setPrefix_pin_updateWithProgress') 109 | end 110 | end 111 | end 112 | -------------------------------------------------------------------------------- /spec/unit/hooks_spec.rb: -------------------------------------------------------------------------------- 1 | require File.expand_path('../../spec_helper', __FILE__) 2 | require 'cocoapods_mangle/hooks' 3 | 4 | def trigger_post_install(installer_context, options) 5 | post_install_hooks = Pod::HooksManager.registrations[:post_install] 6 | hook = post_install_hooks.find { |h| h.plugin_name == CocoapodsMangle::NAME } 7 | hook.block.call(installer_context, options) 8 | end 9 | 10 | describe CocoapodsMangle::Hooks do 11 | let(:installer_context) { instance_double('installer context') } 12 | let(:options) { double('options') } 13 | let(:mangle_context) { instance_double('installer context') } 14 | let(:post_install) { double('post install') } 15 | 16 | before do 17 | allow(CocoapodsMangle::Context).to receive(:new).with(installer_context, options).and_return(mangle_context) 18 | allow(CocoapodsMangle::PostInstall).to receive(:new).with(mangle_context).and_return(post_install) 19 | allow(post_install).to receive(:run!) 20 | end 21 | 22 | context 'post install' do 23 | it 'runs the post install action' do 24 | expect(post_install).to receive(:run!) 25 | trigger_post_install(installer_context, options) 26 | end 27 | end 28 | end 29 | -------------------------------------------------------------------------------- /spec/unit/post_install_spec.rb: -------------------------------------------------------------------------------- 1 | require File.expand_path('../../spec_helper', __FILE__) 2 | require 'cocoapods_mangle/post_install' 3 | 4 | describe CocoapodsMangle::PostInstall do 5 | let(:context) do 6 | instance_double('Mangle context') 7 | end 8 | let(:subject) do 9 | CocoapodsMangle::PostInstall.new(context) 10 | end 11 | let(:config) { double('config') } 12 | 13 | context '.run!' do 14 | let(:specs_checksum) { 'checksum' } 15 | 16 | before do 17 | allow(subject).to receive(:config).and_return(config) 18 | allow(context).to receive(:specs_checksum).and_return(specs_checksum) 19 | end 20 | 21 | it 'updates mangling and pod xcconfigs' do 22 | allow(config).to receive(:needs_update?).and_return(true) 23 | expect(config).to receive(:update_mangling!) 24 | expect(config).to receive(:update_pod_xcconfigs_for_mangling!) 25 | 26 | subject.run! 27 | end 28 | 29 | it 'updates pod xcconfigs only' do 30 | allow(config).to receive(:needs_update?).and_return(false) 31 | expect(config).not_to receive(:update_mangling!) 32 | expect(config).to receive(:update_pod_xcconfigs_for_mangling!) 33 | 34 | subject.run! 35 | end 36 | end 37 | 38 | context '.config' do 39 | let(:specs_checksum) { 'checksum' } 40 | 41 | before do 42 | allow(subject).to receive(:specs_checksum).and_return(specs_checksum) 43 | allow(CocoapodsMangle::Config).to receive(:new).with(context).and_return(config) 44 | end 45 | 46 | it 'creates a config' do 47 | expect(CocoapodsMangle::Config).to receive(:new).with(context) 48 | expect(subject.config).to eq(config) 49 | end 50 | end 51 | end 52 | --------------------------------------------------------------------------------