前置き
iOSというかllvmでコンパイルするときのARCをソースで管理するときの話です。
この方法はMacでしかできないと思います。
結論
追記1(後で別に書くかも・・・)
[Target] -> [Build Phase] -> [Compile Sources]
にてコンパイラフラグを個別に指定してできる。(参考元)
追記2 個人的には混在は嫌いなので、共有ものはライブラリにする方向でその中はARCのON/OFFに依存して統一して書いたのがよいと思う。
ソースで管理するなら、ライブラリを作成してそれを使用するのがいいと思いました。
判断方法
この方法が正攻法かは不明... orz
#if __has_feature(objc_arc)
一応ARCの設定方法
XCode 4.2 の SingleViewApp のとき対応方法
ARC の ON/OFF 対応ようヘッダーファイルを ARCHandle.h を作成
#if __has_feature(objc_arc)
#define AUTORELEASE(A) A
#define ARC_ON
#else
#define AUTORELEASE(A) [A autorelease]
#define ARC_OFF
#endif
AppDelegate.m を変更
// ARC ON の時は基本的に dealloc 書かないので丸ごと削除
#ifdef ARC_OFF
- (void)dealloc
{
[_window release];
[_viewController release];
[super dealloc];
}
#endif
//
// マクロで autorelease を隠蔽したりしなかったり
//
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = AUTORELEASE([[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] );
// Override point for customization after application launch.
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
self.viewController = AUTORELEASE([[GVViewController alloc] initWithNibName:@"GVViewController_iPhone" bundle:nil]);
} else {
self.viewController = AUTORELEASE([[GVViewController alloc] initWithNibName:@"GVViewController_iPad" bundle:nil]);
}
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
return YES;
}
ViewController.m を変更
UILabel に ARC ON/OFFでラベルの内容をかえてます
#if __has_feature(objc_arc)
#define HELLO @"Hello ARC"
#else
#define HELLO @"Hello ..."
#endif
ARC ON
ARC OFF