2009-09-05 78 views
1

我正在使用SDK 3.0.1版。UIImageWriteToSavedPhotosAlbum显示iPhone连接到仪器的内存泄漏

随着连接到仪器的iPhone,当我打电话给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可能已知的问题?

这里是从仪器的堆栈跟踪:

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); 

同样的泄漏显示了正确的应用程序加载后

感谢您的帮助。

布莱恩

回答

0

快速浏览一下没有发现任何你拥有的任何对象,需要释放。仔细查看代码,了解获取新对象,分配,复制或保留的位置。这些是你必须担心释放的物体。

+0

谢谢你的回复和信息。我检查了我的代码,似乎无法找到任何我没有发布的东西。我从仪器添加了堆栈跟踪到上面的问题。泄漏位于:GeneralBlock-3584,大小为:3.50 KB 再次感谢您的帮助。 – stopmotion24 2009-09-06 03:03:02

+0

我做了一个新项目的测试,只在viewdidload下面添加下面的代码: NSString * gnTmpStr = [NSString stringWithFormat:@“DefaultTest”]; UIImage * ganTmpImage = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:gnTmpStr ofType:@“png”]]; \t //请求将图像保存到相机胶卷 UIImageWriteToSavedPhotosAlbum(ganTmpImage,nil,nil,nil); 应用程序加载后出现相同的泄漏。 – stopmotion24 2009-09-06 04:38:32

+0

我在苹果开发者论坛上发布了这个问题,这里有链接。 https://devforums.apple.com/message/119423#119423 – stopmotion24 2009-09-07 02:43:09

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; 
} 

}