我正在使用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);
在应用加载
后立即显示相同的泄漏感谢您的帮助。
布赖恩
答案 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)
快速查看不会显示您拥有并需要发布的任何对象。查看代码,了解获取新对象,分配,复制或保留的位置。这些是您必须担心释放的对象。