xCode 4.3 のメモリ リーク インストルメントに非常に奇妙な問題があります... 基本的に、次の場合は機能しません...
- プロジェクトは ARC サポートなしで作成されます。
- UIViewを継承するシンプルなクラスを作成する
- 「ボタン」を使用してこのクラスのインスタンスを作成し、それを「リーク」します...リークはLeak Instrumentsによってキャッチされません
これがPROBLEMATICクラスのコードです
@interface LeakTestView : UIView
- (id)initWithFrame:(CGRect)frame;
@end
@implementation LeakTestView
- (id)initWithFrame:(CGRect)frame
{
NSLog(@"initWithFrame called");
self = [super initWithFrame:frame];
if (self) {
// Initialization code
}
return self;
}
@end
そして今、私はリークを作成します...
- (IBAction)leak:(id)sender {
LeakTestView* leak=[[LeakTestView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
NSLog(@"class is %@", [leak class]);
}
問題は、このリークが検出されないことです...
基本クラスを NSObject に変更し、initWithFrame オーバーライド init の代わりに (以下を参照)、リークが検出されます....
これが検出されるリークのコードです
@interface LeakTestView : NSObject
- (id) init;
@end
@implementation LeakTestView
- (id) init {
NSLog(@"init called");
self = [super init];
if (self) {
}
return self;
}
@end
ここでオブジェクトを作成してそのままにしておくと、リーク検出がトリガーされ、リークがインストルメントに「表示」されます。
- (IBAction)leak:(id)sender {
LeakTestView* leak=[[LeakTestView alloc]init];
NSLog(@"class is %@", [leak class]);
}
何が起こっているのですか?UIView サブクラスのリークが検出されないのに、基本クラスを NSObject に変更すると問題が「修正」されるのはなぜですか? ああ、はい、リークされたオブジェクトは「マークヒープ」を使用して見ることができます-リークの前に1つのマーク、ボタンをクリックしてリークを作成した後に1つのマーク-クラスはヒープデルタに表示されます...
編集:もう1つの「面白い」状況...「init」のものを削除すると(オブジェクトのみを割り当てます)
LeakTestView* leak=[LeakTestView alloc];
その後、基本クラスが何であれ、リークが検出されます...一体何が起こっているのでしょうか?
EDIT2:もう1つの「面白い」こと。リーク検出の問題は、シミュレータ (iOS 5.0、9A334 は私のもの) でのみ観察できますが、iPad デバイスを使用している場合、リークは常に検出されます...
コメントはありますか?問題がない場合、または私が「嘘をついている」と考えている場合は、私が間違っていることを教えてください。上記のケースは「問題なく」機能しています。