テストケースとしてコミットするのをやめ、ブログにメモとして残すことにしました (笑)
[NSValue valueWithCGPoint:CGPointMake(10, 10)]
や
[NSDate date]
のようなallocしてなくてinit***から始まらないものは、Autoreleaseで解放されちゃうので注意 ということ。
NSAutoreleasePoolなんて、つかってねーよ! という場合でも使用ライブラリによっては実は走っていた!なんて事があるのでちゃんとしとかなくてはイケマセン。
もれちゃうと、EXEC_BAD_ACCESS がでちゃったり、メモリーリークしちゃったり、このタイミングではOKなのに、その後のタイミングではNGだ ... と私のようにハマりますw
以下、簡潔にしたテストコード。
- (void)testNSValue { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSValue *nsValue = [NSValue valueWithCGPoint:CGPointMake(10, 10)]; [nsValue retain]; STAssertEquals((int) [nsValue retainCount], 2, @"retain したので2つになっているはず"); NSObject *nsObject = [[NSObject alloc] init]; [nsObject retain]; STAssertEquals((int) [nsObject retainCount], 2, @"retain したので2つになっているはず"); NSDate *nsDate = [NSDate date]; [nsDate retain]; STAssertEquals((int) [nsDate retainCount], 2, @"retain したので2つになっているはず"); [pool release]; // autorelease を release STAssertEquals((int) [nsValue retainCount], 1, @"autorelease により1になる"); STAssertEquals((int) [nsObject retainCount], 2, @"NSObjectはallocしてるのでautoreleaseしても2のまま"); STAssertEquals((int) [nsDate retainCount], 1, @"autorelease により1になる"); }