2012-02-02 8 views
4

Appleのサンプルコード "tweeting"を取り出し、ARC(download my project here to test the problem yourself)を使用しないように修正しました。実際に一つだけ「自動リリース」文が必要だった。ARTなしのTWTweetComposeViewControllerメモリリーク

// Set up the built-in twitter composition view controller. 
tweetViewController = [[[TWTweetComposeViewController alloc] init]autorelease]; 

// Set the initial tweet text. See the framework for additional properties that can be set. 
[tweetViewController setInitialText:@"Hello. This is a tweet."]; 

// Create the completion handler block. 
[tweetViewController setCompletionHandler:^(TWTweetComposeViewControllerResult result) { 
    NSString *output; 

    switch (result) { 
     case TWTweetComposeViewControllerResultCancelled: 
      // The cancel button was tapped. 
      output = @"Tweet cancelled."; 
      break; 
     case TWTweetComposeViewControllerResultDone: 
      // The tweet was sent. 
      output = @"Tweet done."; 
      break; 
     default: 
      break; 
    } 

    //[self performSelectorOnMainThread:@selector(displayText:) withObject:output waitUntilDone:NO]; 

    // Dismiss the tweet composition view controller. 
    [self dismissModalViewControllerAnimated:NO]; 


}]; 

// Present the tweet composition view controller modally. 
[self presentModalViewController:tweetViewController animated:YES]; 

あなたはつぶやきを送信したり、「tweetViewController」でキャンセルをクリックすると、あなたがtweetViewControllerの割り当てが解除されることを期待します。その代わりに、オブジェクトは添付されたイメージ(ツイートに添付されている場合)を含むメモリ内に残ります。だから、ユーザーが別のツイートを作ろうとすると、tweetViewControllerがリークしたためにアプリケーションのメモリが大きくなってしまいます。

お気づきのように自動的に保持されていないので、tweetViewControllerは、ブロック内で言及されていません。..

私は「[[TWTweetComposeViewControllerのalloc]のinit]は、」メモリリークが発生していること。楽器を使用して1を証明しました

私がそれを証明するために試した別のことは、 "NSLog("%@ "、tweetViewController);"コントローラーが解除された後のいくつかのランサイクルです。 tweetViewControllerがTWTweetComposeViewControllerインスタンスを指していないため、通常はプログラムがクラッシュしているはずです。代わりに、以前のインスタンスを正しく印刷し、メモリリークを証明しました。

私は、これはメモリ管理規則に違反によるものであり、避けるために発見した唯一の方法は以下の通りです:

[tweetViewController setCompletionHandler:^(TWTweetComposeViewControllerResult result) { 

    // Dismiss the tweet composition view controller using animated YES!! 
    [self dismissModalViewControllerAnimated:YES]; 
    [tweetViewController release]; 

}]; 

アニメーションせずにそれを却下した場合、メモリリークが発生します...あなたを持っています問題に気付いた?私は何か間違っているのですか?あなた自身で試してみてください... instruments showing the "leak"

答えて

2

これは既知のバグであり、現在Appleの調査中です!私はそれがiOS 5.1で修正されることを願っています。

+0

これに関するアップデートはありますか?私はそれがまだ問題であるかもしれないと思うが、それは私のコードの中で何か他のものかもしれない。 –

+0

iOS 5.1にはまだ存在しています – fphilipe

0

すでに自動リリースしているので、完了ブロックにはreleaseする必要はありません。 autoreleaseコールを削除してみてください。

+0

私はブロック内にリリースすべきではないことを知っています。それがこの「解決策」がメモリ管理ルールに違反した理由です。私はあなたが何の違いもなく言ったように、すでにそれをリリースしようとしました。添付したxcodeプロジェクトを見てください。 – Petrakeas

+0

うーん...バグのように見えます。それを保持している何らかの理由でそれをリリースしていない何か。 – edc1591

関連する問題