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逆引きハンドブック」 – 拡張現実ライフ