Skip to content

Instantly share code, notes, and snippets.

@taktamur
Created October 14, 2012 10:51
Show Gist options
  • Save taktamur/3888240 to your computer and use it in GitHub Desktop.
Save taktamur/3888240 to your computer and use it in GitHub Desktop.
@Propertyの"coyp"と"retain"を比べる/getterでの戻り値のretainCountのチェック
// テスト用のクラス
@interface MyObject : NSObject
@property(nonatomic,retain)NSObject *retainedObject; // retainするプロパティ
@property(nonatomic,copy)NSObject *copiedObject; // copyするプロパティ
@end
@implementation MyObject
@synthesize retainedObject,copiedObject;
@end
// @propertyでretainされた場合とcopyされた場合での挙動の違い
// 非ARC環境
MyObject *obj = [[MyObject alloc]init];
// setter
{
// ここで不変のオブジェクト(NSStringとかNSValueとか)を入れてると、
// retainCountとかがINT_MAXになったりする。最適化されてるんだろう。
// またNSObjectでもCopyが実装されていないから、setterでエラーになる。
NSObject *obj1 = [[NSMutableString alloc]initWithString:@"obj1"];
NSObject *obj2 = [[NSMutableString alloc]initWithString:@"obj2"];
NSLog(@"obj1 retainCount=%d",[obj1 retainCount]); // 1
obj.retainedObject=obj1;
NSLog(@"obj1 retainCount=%d",[obj1 retainCount]); // 2
NSLog(@"obj2 retainCount=%d",[obj2 retainCount]); // 1
obj.copiedObject=obj2; // Copyプロトコルを継承してないとここでエラー
NSLog(@"obj2 retainCount=%d",[obj2 retainCount]); // 1 コピーなのでretaincount増えない
[obj1 release];
[obj2 release];
}
// getter
// ここでautoreleasaeされたオブジェクトが返って、retainCountが増えてる、、
// と予想したのだけど違ってた。
@autoreleasepool {
NSObject *tmp1 = obj.retainedObject;
NSLog(@"tmp1 retainCount=%d",[tmp1 retainCount]); // 1 ←retainCountは特に増えてない?
NSObject *tmp2 = obj.copiedObject;
NSLog(@"tmp2 retainCount=%d",[tmp2 retainCount]); // 1 ←retainCountは特に増えてない?
[NSAutoreleasePool showPools]; // autoreleasepoolをのぞき見
}
// get →直後にset →getしたオブジェクトはどーなるのよ。
// autoreleasepoolに格納されてる、、と思ったけど違う挙動をしている。
NSObject *tmp;
@autoreleasepool {
tmp = obj.retainedObject;
NSLog(@"tmp retainCount=%d",[tmp retainCount]); // 1
obj.retainedObject=nil; // ここでtmpが参照しているオブジェクトはreleaseされた、、はず?
}
NSLog(@"tmp retainCount=%d",[tmp retainCount]); // 1 ????
// この後のtmpが参照しているオブジェクトはどうなるんだ?
@taktamur
Copy link
Author

NSMutableStringを突っ込んでいたので、ここで何かの最適化がされたのだろうか?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment