2011-09-13 7 views
1

ビューコントローラのloadView:メソッドのコードに問題があります。基本的に私は大きな視点(iPad上)に集中し、プログラムで読み込まれたラベル、ボタン、アイコンを持っているビューを持っています。- [CALayer release]:メッセージが割り当て解除されたインスタンスに送信されました

ビューコントローラがdeallocメソッドを呼び出して解放しようとすると、問題が発生します。 - [CALayer release]:メッセージが割り当て解除されたインスタンスに送信され、エラーが発生し、アプリケーションがクラッシュします。

このエラーについて読んでから、私は何かをリリースしすぎているように見えますが、そうは思わないでしょう。以下のコードはトラブルメーカーです。だけでなく、それらを解放していない(私は知っている、私は知っている、それは悪いですが)それはhavokを引き起こし続けます。

container = [[UIView alloc] initWithFrame:CGRectNull]; 
container.autoresizingMask = (UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin); 
container.frame = CGRectMake((viewSize.width-320)/2, (viewSize.height-480)/2, 320, 480); 
[self.view addSubview:container]; 

UILabel *welcomeTo = [[[UILabel alloc] initWithFrame:CGRectNull] autorelease]; 
welcomeTo.backgroundColor = [UIColor clearColor]; 
welcomeTo.font = [UIFont fontWithName:@"HelveticaNeue-Light" size:18.0]; 
welcomeTo.frame = CGRectMake(23, 15, 103, 24); 
welcomeTo.shadowColor = [UIColor blackColor]; 
welcomeTo.shadowOffset = CGSizeMake(0, 1); 
welcomeTo.text = @"Welcome to"; 
welcomeTo.textAlignment = UITextAlignmentLeft; 
welcomeTo.textColor = [UIColor colorWithWhite:1.0 alpha:0.6]; 
[container addSubview:welcomeTo]; 

UILabel *progressions = [[[UILabel alloc] initWithFrame:CGRectNull] autorelease]; 
progressions.backgroundColor = [UIColor clearColor]; 
progressions.font = [UIFont fontWithName:@"HelveticaNeue-BoldItalic" size:44.0]; 
progressions.frame = CGRectMake(20, 30, 280, 56); 
progressions.shadowColor = [UIColor blackColor]; 
progressions.shadowOffset = CGSizeMake(0, 1); 
progressions.text = @"Progressions"; 
progressions.textAlignment = UITextAlignmentCenter; 
progressions.textColor = [UIColor colorWithWhite:1.0 alpha:0.6]; 
[container addSubview:progressions]; 

UILabel *blurb = [[[UILabel alloc] initWithFrame:CGRectNull] autorelease]; 
blurb.backgroundColor = [UIColor clearColor]; 
blurb.font = [UIFont fontWithName:@"HelveticaNeue" size:14.0]; 
blurb.frame = CGRectMake(23, 100, 274, 51); 
blurb.numberOfLines = 3; 
blurb.shadowColor = [UIColor blackColor]; 
blurb.shadowOffset = CGSizeMake(0, 1); 
blurb.text = @"Kick off the fun by adding some content, or if you're not sure what you're doing, check out the \"Getting Started\" guide!"; 
blurb.textAlignment = UITextAlignmentLeft; 
blurb.textColor = [UIColor colorWithWhite:1.0 alpha:0.6]; 
[container addSubview:blurb]; 

UIButton *button1 = [[UIButton alloc] initWithFrame:CGRectMake(20, 170, 280, 88)]; 
[button1 setBackgroundImage:[UIImage imageNamed:@"emptyButtonLarge.png"] forState:UIControlStateNormal]; 
[button1 setBackgroundImage:[UIImage imageNamed:@"emptyButtonLargeHighlighted.png"] forState:UIControlStateHighlighted]; 
[button1 addTarget:self action:@selector(createChart:) forControlEvents:UIControlEventTouchUpInside]; 
[container addSubview:button1]; 
[button1 release]; 

UIImageView *icon1 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"addchart.png"]]; 
icon1.frame = CGRectMake(30, 180, icon1.frame.size.width, icon1.frame.size.height); 
[container addSubview:icon1]; 
[icon1 release]; 

UILabel *button1title = [[[UILabel alloc] initWithFrame:CGRectMake(110, 185, 180, 20)] autorelease]; 
button1title.backgroundColor = [UIColor clearColor]; 
button1title.font = [UIFont boldSystemFontOfSize:17.0]; 
button1title.shadowColor = [UIColor blackColor]; 
button1title.shadowOffset = CGSizeMake(0, 1); 
button1title.text = @"Create a Chart"; 
button1title.textAlignment = UITextAlignmentLeft; 
button1title.textColor = [UIColor colorWithWhite:1.0 alpha:0.6]; 
[container addSubview:button1title]; 

UILabel *button1blurb = [[[UILabel alloc] initWithFrame:CGRectMake(110, 205, 180, 40)] autorelease]; 
button1blurb.backgroundColor = [UIColor clearColor]; 
button1blurb.font = [UIFont systemFontOfSize:13.0]; 
button1blurb.numberOfLines = 2; 
button1blurb.shadowColor = [UIColor blackColor]; 
button1blurb.shadowOffset = CGSizeMake(0, 1); 
button1blurb.text = @"A cheat sheet for a displaying a song in any key."; 
button1blurb.textAlignment = UITextAlignmentLeft; 
button1blurb.textColor = [UIColor colorWithWhite:1.0 alpha:0.6]; 
[container addSubview:button1blurb]; 

UIButton *button2 = [[UIButton alloc] initWithFrame:CGRectMake(20, 270, 280, 88)]; 
[button2 setBackgroundImage:[UIImage imageNamed:@"emptyButtonLarge.png"] forState:UIControlStateNormal]; 
[button2 setBackgroundImage:[UIImage imageNamed:@"emptyButtonLargeHighlighted.png"] forState:UIControlStateHighlighted]; 
[button2 addTarget:self action:@selector(createSet:) forControlEvents:UIControlEventTouchUpInside]; 
[container addSubview:button2]; 
[button2 release]; 

UIImageView *icon2 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"addset.png"]]; 
icon2.frame = CGRectMake(30, 280, icon2.frame.size.width, icon2.frame.size.height); 
[container addSubview:icon2]; 
[icon2 release]; 

UILabel *button2title = [[[UILabel alloc] initWithFrame:CGRectMake(110, 285, 180, 20)] autorelease]; 
button2title.backgroundColor = [UIColor clearColor]; 
button2title.font = [UIFont boldSystemFontOfSize:17.0]; 
button2title.shadowColor = [UIColor blackColor]; 
button2title.shadowOffset = CGSizeMake(0, 1); 
button2title.text = @"Create a Set"; 
button2title.textAlignment = UITextAlignmentLeft; 
button2title.textColor = [UIColor colorWithWhite:1.0 alpha:0.6]; 
[container addSubview:button2title]; 

UILabel *button2blurb = [[[UILabel alloc] initWithFrame:CGRectMake(110, 305, 180, 40)] autorelease]; 
button2blurb.backgroundColor = [UIColor clearColor]; 
button2blurb.font = [UIFont systemFontOfSize:13.0]; 
button2blurb.numberOfLines = 2; 
button2blurb.shadowColor = [UIColor blackColor]; 
button2blurb.shadowOffset = CGSizeMake(0, 1); 
button2blurb.text = @"A collection of charts that can be displayed like a book."; 
button2blurb.textAlignment = UITextAlignmentLeft; 
button2blurb.textColor = [UIColor colorWithWhite:1.0 alpha:0.6]; 
[container addSubview:button2blurb]; 

UIButton *button3 = [[UIButton alloc] initWithFrame:CGRectMake(20, 370, 280, 40)]; 
[button3 setBackgroundImage:[UIImage imageNamed:@"emptyButtonSmall.png"] forState:UIControlStateNormal]; 
[button3 setBackgroundImage:[UIImage imageNamed:@"emptyButtonSmallHighlighted.png"] forState:UIControlStateHighlighted]; 
[button3 addTarget:self action:@selector(gettingStarted:) forControlEvents:UIControlEventTouchUpInside]; 
[container addSubview:button3]; 
[button3 release]; 

UILabel *button3title = [[[UILabel alloc] initWithFrame:CGRectMake(20, 370, 280, 36)] autorelease]; 
button3title.backgroundColor = [UIColor clearColor]; 
button3title.font = [UIFont boldSystemFontOfSize:17.0]; 
button3title.shadowColor = [UIColor blackColor]; 
button3title.shadowOffset = CGSizeMake(0, 1); 
button3title.text = @"Getting Started"; 
button3title.textAlignment = UITextAlignmentCenter; 
button3title.textColor = [UIColor colorWithWhite:1.0 alpha:0.6]; 
[container addSubview:button3title]; 

UILabel *version = [[[UILabel alloc] initWithFrame:CGRectMake(20, 420, 280, 20)] autorelease]; 
version.backgroundColor = [UIColor clearColor]; 
version.font = [UIFont fontWithName:@"HelveticaNeue-Light" size:12.0]; 
version.shadowColor = [UIColor blackColor]; 
version.shadowOffset = CGSizeMake(0, 1); 
version.text = [NSString stringWithFormat:@"Version v%@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"], kRevisionNumber]; 
version.textAlignment = UITextAlignmentCenter; 
version.textColor = [UIColor colorWithWhite:1.0 alpha:0.6]; 
[container addSubview:version]; 

次のようにコンテナのプロパティは、deallocメソッドでリリースされています。人々は提供することができます

- (void)dealloc { 
    [leather release]; 
    [backButton release]; 
    [container release]; 
    [super dealloc]; 
} 

任意の答えや提案をいただければ幸いです!私は本当に困惑しています。

+0

を、あなたはこのすべてをコメントし、実行しようとしてみてください? – Nekto

+0

コードでAnalyzeを実行しましたか? [Product]メニューから[Analyze]を選択します。すべての間違いを修正してください。その後、Instruments - > Leaksを使用してアプリのプロファイルを作成します。あなたのコードで作成された赤いリークマーカーがないか調べてください(Appleライブラリのものは無視してください)。 –

+0

@しんとう - やったよ。上記のコードがすべてコメントアウトされているとうまく動作します。 –

答えて

47

アプリケーションをシミュレータで 'ゾンビ'音源でプロファイルします。

アプリをしばらく実行して、アプリをクラッシュさせるために必要な作業をしてください。それがないときは、下の画像のようなポップアップを取得し、それはアプリのプロファイリングを停止します。

Zombie accessed

を次にあなたが次のアドレス(0x158b3c00)に小さな矢印をクリックした場合..それはリリースされたオブジェクト(ゾンビ)のオブジェクトの保持/解放履歴に移動します。

あなたが-1に行った回数を保持場所の上の行、およびオープンビューを強調表示している場合 - >拡張の詳細を、そのオブジェクトがoverreleasedれたコード内のスタックトレースとラインにあなたを指している必要があり:

あなたはそれが発生しているクラスをダブルクリックするとStack trace

、それはあなたのソースを開いて、あなたのコードの悪い行が表示されます:

over released code

+0

あなたの努力のために+1! – Jeremy

+0

+1 bht alla man。 – NaXir

+0

+1とゾンビのトレース方法についての説明と写真 – Niro

0

オブジェクトの存続期間中であって、作成されているときだけではなく、オーバーリリースが発生している可能性があります。いくつかのヒント:

  • 利用アクセサrelease/autoreleaseの使用と一致しているポインタがnil
  • に設定されていることを確実にします。個人的には、私は[[[Class alloc] init] autorelease]をすべて1行に置くことを好みます。
  • release/autoreleaseの違いを知る Let's Build NSAutoreleasePoolは良い出発点です。
関連する問題