什么是非脆弱的ABI?

时间:2012-09-20 22:50:32

标签: objective-c xcode cocoa compiler-construction 64-bit

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

  

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

  

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

那说...... 什么是非脆弱的ABI?(为什么它不被称为更抽象/更清楚解释的东西?)

1 个答案:

答案 0 :(得分:0)

经过一番探讨之后,关于这个主题的最佳摘要/建议之一是以下内容......

  

非脆弱的ABI允许更改超类的ivars而不破坏已编译的子类(以及其他内容)。虽然它只支持Mac上的64位,但由于向后兼容性问题而无法在现有的32位架构上支持它。

It goes on to say, basically ..如果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 )