Fuga de memory TWTweetComposeViewController sin ARC

Tomé el código de ejemplo de manzana "twitteando" y lo modifiqué para que no use ARC ( descargue mi proyecto aquí para probar el problema usted mismo ). En realidad, solo se necesitaba una statement de "autorelease":

// 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]; 

Si envía el tweet o hace clic en cancelar en "tweetViewController", esperaría que tweetViewController se desasigne. En cambio, el object permanece en la memory, incluida la image adjunta (si ha adjuntado una en el tuit). Por lo tanto, si el usuario intenta hacer otro tuit, la memory de la aplicación se agranda porque se filtró tweetViewController.

Como se observa, tweetViewController no se menciona dentro del bloque, por lo que no se retiene automáticamente.

Utilicé instrumentos y probé 1 que "[[TWTweetComposeViewController alloc] init]" provoca una pérdida de memory.

Otra cosa que probé para demostrarlo fue a "NSLog ("% @ ", tweetViewController);" unos pocos runcycles después de que el controller ha sido descartado. Normalmente, el progtwig debería haberse bloqueado porque tweetViewController no apuntaría a una instancia de TWTweetComposeViewController. En su lugar, imprimió correctamente la instancia anterior, probando la pérdida de memory.

La única manera que he encontrado para evitar esto es violar las reglas de administración de memory y es la siguiente:

 [tweetViewController setCompletionHandler:^(TWTweetComposeViewControllerResult result) { // Dismiss the tweet composition view controller using animated YES!! [self dismissModalViewControllerAnimated:YES]; [tweetViewController release]; }]; 

Si lo descarta sin animation, se produce una pérdida de memory … ¿Ha notado el problema? ¿Estoy haciendo algo mal? Pruébelo usted mismo y comente por favor … instrumentos que muestran la "fuga"

Resulta que es un error conocido y ¡actualmente está siendo investigado por Apple! Espero que se arregle en iOS 5.1

No deberías tener que release en el bloque de finalización ya que ya lo estás autorellando. Intente eliminar la llamada de autorelease y release después de [self presentModalViewController:tweetViewController animated:YES];