7

Xcode 内で「非脆弱 ABI」が参照される頻度と実際の問題を考慮すると、誰もが「非脆弱 ABI」が何であるかを知っていることを暗示しているように思われるかもしれません。例えば...

下付き文字には、脆弱でない ABI で一定でないインターフェイス ノードのサイズが必要です

また

使用する Objective-C ABI バージョンを選択します。利用可能なバージョンは、1 (従来の「脆弱な」ABI)、2 (脆弱でない ABI 1)、および 3 (脆弱でない ABI 2) です。

そうは言っても...脆弱でない ABI とは何ですか? (そして、なぜそれは抽象的でない/より明確に説明されたものと呼ばれないのですか?)

4

2 に答える 2

16

脆弱でない ABI は、すべてのサブクラスの再コンパイルを必要とせずにインスタンス変数をクラスに追加する機能を指します。

つまり、v1 (実際には ObjC の真のバージョンはありません) では、Apple がたとえば NSView (Cocoa、32 ビット) にインスタンス変数を追加する場合、NSView のすべてのサブクラス (またはサブクラスのサブクラス) は、再コンパイルしないと爆発します。v2 と v3 はこれを修正します。

このウェブログ投稿で詳しく説明されています。

参照しているドキュメントは、llvm/clang の man ページにあります。ほとんどの場合、ほとんどの開発者にとって非常にまれな場所です。コンパイラを直接動かしている Makefile を書いていない限り、そのページを読む理由はあまりありません (もちろん、非常に教育的である探検を除いて)。

これは Unix の man ページのスタイルで書かれており、驚くことではありませんが、少し... 鈍いです。ほとんどすべてのタスクについて、より高いレベルのドキュメントに固執するのが最善です。つまり、Xcode のビルド設定のドキュメントは一般的で、それほど鈍感ではありません。

于 2012-09-20T22:59:39.510 に答える
0

ざっと調べた結果、この件に関する最高の要約/アドバイスの1つは次のとおりです…</p>

脆弱でない ABI により、(特に) コンパイル済みのサブクラスを壊すことなく、スーパークラスの ivar を変更することができます。ただし、下位互換性の問題により、既存の 32 ビット アーキテクチャではサポートできないため、Mac では 64 ビットでのみサポートされています。

基本的に、「アクティブなアーキテクチャのみ」、つまり64ビットのみでビルドするように構成されていることが多いXcodeの場合、「リリース」スキームに切り替えるときに問題が発生する可能性があります。通常、両方の (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 に答える