7

似乎暗示每个人都知道“非易碎 ABI”是什么——考虑到它在 Xcode 中被引用的频率和事实性质。例如...

下标需要接口节点的大小,在非易碎 ABI 中不是恒定的

或者

选择要使用的 Objective-C ABI 版本。可用版本为 1(旧版“脆弱”ABI)、2(非脆弱 ABI 1)和 3(非脆弱 ABI 2)。

也就是说……什么是非脆弱 ABI?(为什么不把它称为不那么抽象/解释得更清楚的东西?)

4

2 回答 2

16

non-fragile ABI 是指在一个类中添加实例变量而不需要重新编译所有子类的能力。

即在 v1 中(实际上没有真正的 ObjC 版本),如果 Apple 要向 NSView(在 Cocoa 上,32 位)添加一个实例变量,那么 NSView 的每个子类(或子类的子类)都必须重新编译,否则它们会爆炸。v2 和 v3 解决了这个问题。

在这篇博客文章中有详细解释。

您所指的文档位于 llvm/clang 手册页中。大多数时候,对于大多数开发人员来说,这是非常难得的地方;除非您正在编写直接驱动编译器的 Makefile,否则没有太多理由阅读该页面(除非进行探索——当然,这很有教育意义)。

它是按照 Unix 手册页的风格编写的,毫不奇怪,它有点……迟钝。对于几乎所有任务,最好坚持使用更高级别的文档。即,Xcode 构建设置文档一般不那么迟钝。

于 2012-09-20T22:59:39.510 回答
0

经过一番摸索,关于该主题的最佳总结/建议之一如下……</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 )

于 2012-09-21T14:12:18.360 回答