Created
October 14, 2012 10:51
-
-
Save taktamur/3888240 to your computer and use it in GitHub Desktop.
@Propertyの"coyp"と"retain"を比べる/getterでの戻り値のretainCountのチェック
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// テスト用のクラス | |
@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が参照しているオブジェクトはどうなるんだ? | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
NSMutableStringを突っ込んでいたので、ここで何かの最適化がされたのだろうか?