2011年11月28日月曜日

ARC をソースで!?

前置き

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