什么是非脆弱 ABI?

问题描述 投票:0回答:2

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

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

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

也就是说... 什么是非脆弱 ABI?(为什么不将其称为不太抽象/解释得更清楚的东西?)

objective-c xcode cocoa 64-bit abi
2个回答
16
投票

非脆弱ABI是指无需重新编译所有子类即可向类添加实例变量的能力。

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

在此博客文章中详细解释了

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

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


0
投票

经过一番探索后,关于该主题的最佳总结/建议之一如下......

非脆弱的 ABI 允许更改超类的 ivars 之类的事情,而不会破坏已经编译的子类(除其他外)。不过,由于向后兼容性问题,它仅在 Mac 上的 64 位上受支持,因此不允许他们在现有的 32 位架构上支持它。

它接着说,基本上.. 如果 Xcode(通常配置为仅针对“仅活动架构”(又名仅 64 位)进行构建),那么在切换到“发布版本”时,可能会遇到问题” 方案,通常设置为两种(63 位/32 位)架构构建,又名“通用”..

您可能想在 Mac 上使用 ARC,我很确定您必须放弃 32 位支持才能这样做。您可以在 Xcode 中的目标的构建设置中更改目标架构。

根据我自己的经验,我相信非脆弱的 ABI 让我们受益的是缩写语法和模式,例如……

//  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 )

© www.soinside.com 2019 - 2024. All rights reserved.