ざっと調べた結果、この件に関する最高の要約/アドバイスの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 )