Instrumentでリークした様に見えなくてもリークしているのを調べる方法

Instruments は、Leakを調べられて便利ですが、blocksで、viewのivarを変更してリークしたときなどには、リークしてても、リークとでないことが多いです。それで以前はリークしていないと安心することもありました。でも、やはり、blocks+ARCの事例は、リークが多いので、気をつける必要があります。

まず、こんなかんじの、storyboardを作ってみました。

単純にdetail2を呼んで閉じるstoryboard
単純にdetail2を呼んで閉じるstoryboard

ためしにこんな、リークする事例を作ってみました。

@implementation Detail2ViewController{
id myblock;
id dic;
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
myblock = [^{
dic = [NSMutableDictionary dictionary];
} copy];

}

- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
}

- (void)dealloc
{
dic = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

@end

これでdetail2を呼んで、マスターにすれば、detail2ViewControllerは完全に解放されるはずです。
dealloc時に、nilにしているので、解放されて欲しいところですが、Instrumentsを起動してみます。

ここで、Leaksを使用してみます。

Leaksを使用
Leaksを使用

まず、通常の方法で、セルをクリックして、戻ってきますが、リークは表示されません。

DetailView2Controllerに遷移
DetailView2Controllerに遷移
戻るがリークは表示されて無い
戻るがリークは表示されて無い

今度は再起動してやり直してみましょう。
まず、右上の検索窓に、Detailと入れます。

右上にDetailと入力する
右上にDetailと入力する

Detail2ViewControllerを表示すると、一つのオブジェクトが作成されます。

オブジェクトを作成
オブジェクトを作成

そして元の画面に戻ると、Detail2ViewControllerがリリースされているはずが。。。?

Detail2ViewController 解放されていない
Detail2ViewController 解放されていない

しかも何度も行ったり来たりしていると。。。

複数のオブジェクトが残っている
複数のオブジェクトが残っている

この場合は5個のオブジェクトが解放されずに残っています。

ちなみにこのソースを__weakを使って書き換えてあげると…変更部分だけ。

__weak Detail2ViewController* bself=self;
myblock = [^{
bself->dic = [NSMutableDictionary dictionary];
} copy];

この様に書くと、何度行ったり来たりしてもリークしていません。

捕捉ですが、blocksをすぐに実行しないときは、copyをしないと、EXC_BAD_ACCESSでクラッシュしてしまいます。しかも、これは、Debugビルドでは発生せず、Releaseでしかクラッシュしないという、とてもたちの悪い動きをします。
こちらの記事をご覧下さい。
あのblocksは大丈夫?iOSで、blocksを使った記述で、リリースビルドのみにクラッシュする事例 | Zero4Racer PRO Developer’s Blog

基本的に、アップルのガイドに、Blocksの正しい使い方が書かれているので、そちらを参照ください。InstrumentのLeakで出ていないので大丈夫というのは、危険という話でした。
Blocks Programming Topics: Introduction
こちらをご覧下さい。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください