似乎暗示每个人都知道“非易碎 ABI”是什么——考虑到它在 Xcode 中被引用的频率和事实性质。例如...
下标需要接口节点的大小,在非易碎 ABI 中不是恒定的
或者
选择要使用的 Objective-C ABI 版本。可用版本为 1(旧版“脆弱”ABI)、2(非脆弱 ABI 1)和 3(非脆弱 ABI 2)。
也就是说……什么是非脆弱 ABI?(为什么不把它称为不那么抽象/解释得更清楚的东西?)
似乎暗示每个人都知道“非易碎 ABI”是什么——考虑到它在 Xcode 中被引用的频率和事实性质。例如...
下标需要接口节点的大小,在非易碎 ABI 中不是恒定的
或者
选择要使用的 Objective-C ABI 版本。可用版本为 1(旧版“脆弱”ABI)、2(非脆弱 ABI 1)和 3(非脆弱 ABI 2)。
也就是说……什么是非脆弱 ABI?(为什么不把它称为不那么抽象/解释得更清楚的东西?)
non-fragile ABI 是指在一个类中添加实例变量而不需要重新编译所有子类的能力。
即在 v1 中(实际上没有真正的 ObjC 版本),如果 Apple 要向 NSView(在 Cocoa 上,32 位)添加一个实例变量,那么 NSView 的每个子类(或子类的子类)都必须重新编译,否则它们会爆炸。v2 和 v3 解决了这个问题。
在这篇博客文章中有详细解释。
您所指的文档位于 llvm/clang 手册页中。大多数时候,对于大多数开发人员来说,这是非常难得的地方;除非您正在编写直接驱动编译器的 Makefile,否则没有太多理由阅读该页面(除非进行探索——当然,这很有教育意义)。
它是按照 Unix 手册页的风格编写的,毫不奇怪,它有点……迟钝。对于几乎所有任务,最好坚持使用更高级别的文档。即,Xcode 构建设置文档一般不那么迟钝。
经过一番摸索,关于该主题的最佳总结/建议之一如下……</p>
非脆弱 ABI 允许在不破坏已经编译的子类的情况下更改超类的 ivars(除其他外)。但它仅在 Mac 上的 64 位上受支持,因为向后兼容性问题不允许他们在现有的 32 位架构上支持它。
它继续说,基本上.. 如果 Xcode,它通常被配置为构建“仅活动架构”,也就是仅 64 位..在切换到“发布”方案时可能会遇到问题,即通常设置为为两种(63 位/32 位)架构构建,又名“通用”..
您可能想在 Mac 上使用 ARC,我很确定您必须放弃 32 位支持才能这样做。您可以在 Xcode 中为您的目标在构建设置中更改目标架构。
以我自己的经验,我相信非脆弱的 ABI 让我们受益的是一种缩写的语法,以及诸如……的模式。</p>
// source.h - readonly public properties.
@interface SuperClassy : NSObject
@property (readonly) NSArray *cantTouchThis;
@end
// source.m set readonly properties, internally.
@implementation SuperClassy
// look, no @synthesize… just use _ivarName.
-(void) touchIt:(NSArray*)a { _cantTouchThis = a; }
@end
int main(int argc, const char * argv[]) {
SuperClassy *it = [SuperClassy new];
// you cannot set it.cantTouchThis = @[anArray].
[it touchIt:@[@"cats"]];
// but you can via a method, etc.
NSLog(@"%@", it.cantTouchThis);
}
NSLOG ➜ ( cats )