ios - 如何使 Obj-C 库全局可重命名(每个类/导出的符号)?
<p><p>在处理一个大型开源项目时,我们遇到了这个问题,因此这是一个很好的案例研究/示例:</p>
<ol>
<li>我们的库实现了 SVG 规范</li>
<li>SVG 规范被<em>定义</em>为“包括”DOM 和 CSS 规范</li>
<li>DOM Spec 需要 DOM 实现,但 Apple 拒绝在 iOS 上分享他们的 DOM 实现</li>
<li>我们必须在 ObjectiveC 中重新实现 DOM,才能正确实现 SVG</li>
<li>但 Apple 意外/故意将一些使用 DOM 保留名称的类放在全局命名空间中。任何人都不可能用这些名字创建一个新类(class)</li>
</ol>
<p>我们当前的解决方法:</p>
<ol>
<li>我们重命名受影响的类,例如“名称”到“AppleHasConflictedThisInGlobalNameSpaceName”。是的,这不是最礼貌的信息,但它向新手解释了为什么我们不得不偏离规范!</li>
</ol>
<p>在 iOS8 中,Apple 再次做到了这一点,并添加了更多解决此问题的类,包括“评论”。 (Apple?真的吗?哦,来吧,伙计们!在向全局空间发送垃圾邮件之前请三思!)。这越来越难以解决。</p>
<hr/>
<p>常规解决方案:由于 C/ObjC 没有命名空间(呜呜!),我们会为每个类添加前缀。 SVG 规范有一个官方前缀——“SVG”——我们使用它。对于非规范类,我们有一个较长的前缀,这可能是我们的开源项目独有的。</p>
<p>但是对于 DOM,我们包含了我们自己的 DOM 实现,并且开发人员的项目可能有不同的专有 DOM 实现。在这里很难想出合理的前缀。 Apple 已经在 Obj-C 平台上保留了“DOM”作为前缀。</p>
<p>如果我们使用前缀“SVGKitDOM”,这将是最小的正确前缀名称,这会使 DOM 中类名的长度增加三倍(!),并且通常会使代码不可读。这也违反了 Apple 对 2-3 个字母前缀的偏好。</p>
<hr/>
<p>该项目是开源的,因此从技术上讲:任何人都可以将源代码全局重命名为他们想要的任何内容。但这对人们来说是一个巨大的痛苦。</p>
<p>我一直在考虑巧妙的宏化解决方法 - 例如#define OPTIONAL_PREFIX DOM/OPTIONAL_PREFIX SVGKitDOM/..etc 允许用户使用他们需要的任何前缀快速重建整个 DOM 和依赖的 SVG 库。</p>
<p>...但这似乎仍然容易出错和困惑。而且它会使新的提交成为噩梦:我们必须教育每个提交者如何在每个类名中使用宏(如果这甚至适用于 ObjC)。</p>
<p>啊!</p>
<p>一定有更简单的方法吗? 30 多年来,命名空间冲突一直是个问题:)。</p>
<p>注意:这是 Objective-C,所以它是 C 的超集,但链接过程<em>不是</em>超集 - 例如,Apple 禁止所有人进行动态链接。所以,我们需要一个静态的解决方案:(。</p></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>或许,你可以使用不常提及的<code>@compatability_alias</code>属性,如下:</p>
<p>文件:PrefixedHeader.h</p>
<pre><code>@interface my_longly_prefixed_ClassThatDoesSomething : NSObject
@end
</code></pre>
<p>文件:ConvenienceHeader.h</p>
<pre><code>@compatibility_alias ClassThatDoesSomething my_longly_prefixed_ClassThatDoesSomething
</code></pre>
<p>如果用户有他们自己的专有 DOM 实现,那么让他们不要导入便利 header ,否则就这样做。 </p>
<p>这行得通吗? </p></p>
<p style="font-size: 20px;">关于ios - 如何使 Obj-C 库全局可重命名(每个类/导出的符号)?,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/26929576/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/26929576/
</a>
</p>
页:
[1]