解決しようとしています ターゲットにカテゴリの実装を含めるのを忘れた場合、Xcode は教えてくれますか? 、そして私は次の解決策を思いつきました:
NSObject+Foo.h
extern int volatile canary;
void canaryCage() {
canary = 0;
}
NSObject+Foo.m
int canary = 0;
ここ#import "NSObject+Foo.h"
で、ソース ファイルにある場合、それNSObject+Foo.m
がターゲットにも含まれていない場合、リンカー エラーが発生します。
#import "NSObject+Foo.h"
ただし、重複する_canaryCage
シンボルを生成するたびに。実装ファイル__COUNTER__
だけなので使えません。シンボル テーブル全体で一意で#import "NSObject+Foo.h"
ある必要があります。canaryCage
次のようなものが必要です:
#define CONCAT(x, y) x##y
#define CONCAT2(x, y) CONCAT(x, y)
extern int volatile canary;
void CONCAT2(canaryCage, __RANDOM__)() {
canary = 0;
}
このように、次のようなソース ファイルがある場合:
Bar.m
#import "NSObject+Foo.h"
バズム
#import "NSObject+Foo.h"
_canaryCage9572098740753234521
とのようなシンボルを取得しますが_canaryCage549569815492345
、競合しません。また、他の重複したシンボル定義でエラーが発生するようにしたいので、有効--allow-multiple-definition
にしたくありません。ヘッダーを編集したソース ファイルをリンクするのを忘れたマーカー以外ld
には使用したくありません。canaryCage
#import