Objective-Cでカテゴリを使って、ARCを使うメソッドと使わないメソッドを混在させる

公開日: : 最終更新日:2014/01/06 Objective-C

こんにちは。アキオ(@akio0911)です。

Objective-Cでカテゴリを使って、同じクラス内でARCを使うメソッドとARCを使わないメソッドを混在することができたので、シェアします。

(もし間違っている箇所がありましたら、ぜひお知らせ下さい!)

MyObject.h

#import <Foundation/Foundation.h>

@interface MyObject : NSObject

@end

MyObject.m

#import "MyObject.h"

@implementation MyObject

- (void)dealloc
{
    NSLog(@"%s", __func__);
    [super dealloc];
}

@end

ARCが機能しているか否かを確認するために、deallocメソッドでログを出力するMyObjectクラスを用意します。

    

TestClass.h

#import <Foundation/Foundation.h>

@interface TestClass : NSObject

- (void)method1;

@end

TestClass.m

#import "TestClass.h"
#import "MyObject.h"

@implementation TestClass

- (void)method1
{
    MyObject *myObject = [[MyObject alloc] init];
}

@end

TestClassクラスのmethod1メソッドでは、ARCを使用するので、autoreleaseやreleaseは呼び出していません。

TestClass+TestClassCategory.h

#import "TestClass.h"

@interface TestClass (TestClassCategory)

- (void)method2;

@end

TestClass+TestClassCategory.m

#import "TestClass+TestClassCategory.h"
#import "MyObject.h"

@implementation TestClass (TestClassCategory)

- (void)method2
{
    MyObject *myObject = [[[MyObject alloc] init] autorelease];
}

@end

TestClassクラスのmethod2メソッドでは、ARCを使用しないので、autoreleaseを呼び出しています。

main.m

#import <Foundation/Foundation.h>

#import "TestClass.h"
#import "TestClass+TestClassCategory.h"

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        TestClass *testClass = [[TestClass alloc] init];
        [testClass method1];
        [testClass method2];
    }
    return 0;
}

main関数では、TestClassクラスのオブジェクトを生成し、method1メソッドとmethod2メソッドを呼び出しています。

Compile Sourcesの設定

TestClass.mではARCを使用し、TestClass+TestClassCategory.mとMyObject.mではARCを使用しないように設定しています。

実行結果

2012-05-31 00:58:33.669 CategoryTest[17194:403] -[MyObject dealloc]
2012-05-31 00:58:33.675 CategoryTest[17194:403] -[MyObject dealloc]

MyObjectクラスのdeallocメソッドが2回呼び出されているので、method1メソッドとmethod2メソッドの両方でオブジェクトが解放されていることが確認できました。

    

Objective-Cの関連記事

入門を終えたiOSプログラマにとっては必読 – 書評「詳解 Objective-C 2.0 改訂版」 – 拡張現実ライフ

標準クラスの英語リファレンスに疲れた方に! 書評「Objective-C逆引きハンドブック」 – 拡張現実ライフ

   

関連記事

サンフランシスコのピア39にあるチャウダーズでクラムチャウダーを食す!

アップルの開発者向けイベント「WWDC2014」に参加するため

ミスドのカルピスドーナツとカルピスポンデリングを食べてみた!

ミスドで期間限定のカルピスコラボ商品「カルピスドーナツ」と「カルピ

十三カレー計画で牛すじカレーネギのせを食す!(大阪・十三)

「iPhoneアプリ開発キャンプ@大阪」のランチで、十三カレー計画

大阪・難波の加寿屋 法善寺でかすうどんを食す。ランチタイムはおにぎり2個まで無料!

大阪・難波の加寿屋 法善寺 (かすうどん KASUYA)で、かす

ライブドアブログで運営していた「あきお商店」を「卵は世界である」に改名しました

少し前からライブドアブログで「あきお商店」というブログをやって

→もっと見る

PAGE TOP ↑