这似乎意味着,每个人都知道什么是“非脆弱的ABI”-考虑到频率和物质的事实-性质,它是指-在Xcode。例如..。
下标要求非脆弱ABI中不恒定的接口节点的大小。
或
选择要使用的目标-C ABI版本。可用的版本是1(遗留的“脆弱”ABI),2,(非脆弱ABI 1)和3(非脆弱ABI 2)。
上面说..。,什么是非脆弱的ABI? (为什么它不被称为不那么抽象的东西/解释得更清楚?)
发布于 2012-09-20 22:59:39
非脆弱ABI指的是在不需要重新编译所有子类的情况下向类添加实例变量的能力。
也就是说,在v1 (实际上没有真正的ObjC版本)中,如果苹果要向NSView (在Cocoa上,32位)添加一个实例变量,那么NSView的每个子类(或子类的子类)都必须重新编译,否则它们就会崩溃。v2和v3修复了这个问题。
这是在这篇博客文章中的细节中解释的。
您所指的文档在llvm/clang手册页中。对于大多数开发人员来说,大多数时候都是非常罕见的地方;除非您正在编写直接驱动编译器的Makefile,否则没有太多的理由阅读该页面(当然,这很有教育意义)。
它是用Unix手册页的样式写的,毫不奇怪,有点.迟钝。对于几乎所有的任务,最好坚持更高层次的文档。也就是说,Xcode构建设置文档一般不那么枯燥。
发布于 2012-09-21 14:12:18
经过一番周旋之后,关于这个主题的最好的总结/建议之一是下面的…
非脆弱的ABI允许改变超类的ivars,而不破坏已经编译的子类(除其他外)。不过,它只在Mac上支持64位,因为向后兼容性的考虑不允许他们在现有的32位架构上支持它。
它接着说,基本上..如果Xcode通常被配置为为"Active Architecture Only“构建,也就是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 )
https://stackoverflow.com/questions/12522053
复制相似问题