UIImageWriteToSavedPhotosAlbum显示连接到Instruments的iPhone的内存泄漏

时间:2009-09-05 06:09:48

标签: iphone memory iphone-sdk-3.0 memory-leaks

我正在使用SDK的3.0.1版。

当iPhone连接到Instruments时,当我调用UIImageWriteToSavedPhotosAlbum时,我的内存泄漏。

以下是我的代码:

    NSString *gnTmpStr = [NSString stringWithFormat:@"%d", count];

UIImage *ganTmpImage = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:gnTmpStr ofType:@"jpg"]];

// Request to save the image to camera roll
UIImageWriteToSavedPhotosAlbum(ganTmpImage, self, @selector(imageSavedToPhotosAlbum:didFinishSavingWithError:contextInfo:), nil);

和选择器方法

        - (void)imageSavedToPhotosAlbum:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {
NSString *message;
 NSString *title;
 if (!error)
 {
  title = @"Wallpaper";
  message = @"Wallpaper Saved";

 }
 else
 {
  title = @"Error";
  message = [error description];

 }
 UIAlertView *alert = [[UIAlertView alloc]
        initWithTitle:title
        message:message 
        delegate:self
        cancelButtonTitle:@"OK"
        otherButtonTitles:nil];
 [alert show];
 [alert release];

    }

一旦图像保存并且选择方法imageSavedToPhotosAlbum被调用,我是否忘记发布内容?或者UIImageWriteToSavedPhotosAlbum可能存在已知问题吗?

这是来自Instruments的堆栈跟踪:

Leaked Object: GeneralBlock-3584
size: 3.50 KB

       30 MyApp start
      29 MyApp main /Users/user/Desktop/MyApp/main.m:14
      28 UIKit UIApplicationMain
      27 UIKit -[UIApplication _run]
      26 GraphicsServices GSEventRunModal
      25 CoreFoundation CFRunLoopRunInMode
      24 CoreFoundation CFRunLoopRunSpecific
      23 GraphicsServices PurpleEventCallback
      22 UIKit _UIApplicationHandleEvent
      21 UIKit -[UIApplication sendEvent:]
      20 UIKit -[UIWindow sendEvent:]
      19 UIKit -[UIWindow _sendTouchesForEvent:]
      18 UIKit -[UIControl touchesEnded:withEvent:]
      17 UIKit -[UIControl(Internal) _sendActionsForEvents:withEvent:]
      16 UIKit -[UIControl sendAction:to:forEvent:]
      15 UIKit -[UIApplication sendAction:toTarget:fromSender:forEvent:]
      14 UIKit -[UIApplication sendAction:to:from:forEvent:]
      13 CoreFoundation -[NSObject performSelector:withObject:withObject:]
      12 UIKit -[UIBarButtonItem(Internal) _sendAction:withEvent:]
      11 UIKit -[UIApplication sendAction:to:from:forEvent:]
      10 CoreFoundation -[NSObject performSelector:withObject:withObject:]
       9 MyApp -[FlipsideViewController svPhoto] /Users/user/Desktop/MyApp/Classes/FlipsideViewController.m:218
       8  0x317fa528
       7  0x317e3628
       6  0x317e3730
       5  0x317edda4
       4  0x3180fc74
       3 Foundation +[NSThread detachNewThreadSelector:toTarget:withObject:]
       2 Foundation -[NSThread start]
       1 libSystem.B.dylib pthread_create
       0 libSystem.B.dylib malloc

我使用新项目进行了测试,并且只在viewDidLoad中添加了以下代码:

NSString *gnTmpStr = [NSString stringWithFormat:@"DefaultTest"];
UIImage *ganTmpImage = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:gnTmpStr ofType:@"png"]];
// Request to save the image to camera roll 
UIImageWriteToSavedPhotosAlbum(ganTmpImage, nil, nil, nil); 

在应用加载

后立即显示相同的泄漏

感谢您的帮助。

布赖恩

2 个答案:

答案 0 :(得分:1)

我想我解决了这个问题。它与contextInfo有关。这就是我所做的,内存泄漏似乎不再出现:

请注意,您必须定义contextInfo的对象类型...

-(IBAction)savePhoto{

 UIImageWriteToSavedPhotosAlbum([UIImage imageNamed:imageName], self, @selector(image:didFinishSavingWithError:contextInfo:), nil);

//MEMORY LEAK HERE
}

- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(NSDictionary *)contextInfo {  
    if (error != NULL){
  UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Image was not saved, sorry" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
  [alert show];
  [alert release];
    }
    else { //no errors


  //tell the user photo ok:
  UIAlertView *alert = [[UIAlertView alloc] initWithTitle:contents message:@"Image was saved to your photos" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
  [alert show];
  [alert release];
    }
 if (image !=NULL){
 [image release];
 image=nil;
 }
 if(contextInfo !=NULL){
  [contextInfo release];
  contextInfo=nil;
 }

}

答案 1 :(得分:0)

快速查看不会显示您拥有并需要发布的任何对象。查看代码,了解获取新对象,分配,复制或保留的位置。这些是您必须担心释放的对象。