要知道手动解决内存泄漏问题,这并不像ARC在iOS中如何处理释放不需要的对象那么容易,感谢Apple引入ARC,这使得工作变得简单。 但我是一个坚持手动解决内存泄漏的人,因为我正在处理不使用ARC的旧代码。好吧,让我解释一下这个问题。我的应用包含在应用中捕获图片的代码。这是完成这项工作的一小段代码。
- (void) takePhoto
{
ipc = [[UIImagePickerController alloc] init];
NSLog(@"retain count of IPC is %d", [ipc retainCount]);
ipc.delegate = self;
NSLog(@"retain count of IPC is %d", [ipc retainCount]);
if(ipc) {
ipc.sourceType = UIImagePickerControllerSourceTypeCamera;
NSLog(@"retain count of IPC is takephoto %d", [ipc retainCount]);
[self presentModalViewController:ipc animated:YES];
NSLog(@"retain count of IPC is %d", [ipc retainCount]);
} else {
VSCore *vsCore = [[VSCore alloc]init];
[vsCore MessageBox:@"Device does not support taking photos"withTitle:kInfoEN];
[vsCore release]; // written on april 14th 2013
}
}
我正在尝试追踪ipc对象的保留计数,所以我把NSlog放在某些地方。一旦我设置了委托,(ipc.delegate = self); UIImagePickercontroller的委托将被调用,其中一个是
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{ }
在这里处理图像之后,我正在打印保留计数ipc,这给我的结果为5,imagepickerdelegate在内部增加了ipc的重新计数,但我只创建了一次ipc对象。根据此链接http://www.markj.net/iphone-memory-management-tutorial-video/。释放次数应等于保留计数。如果我不止一次调用release我将消息发送到deallocated instance。但保留ipc的数量仍然是5.任何人都可以帮我解决这个问题。谢谢,
我在另一个类中释放Ipc,我已经将ipc声称为单吨类中的属性,我正在发布这样的ipc ......
[[[VVideoDevice getInstance] ipc ] release];
ipc是vvideodevice类中的一个属性。
答案 0 :(得分:3)
retainCount没用。别叫它。
关于内存管理的视频是一个可怕的教程,如果它指示你对象的绝对保留计数是有意义的。
您应该通过发布电话平衡您的保留;将每个保留视为计数的+1,并将其与释放进行平衡。
使用ARC。使用Allocations仪器监控内存使用情况。最后,使用静态分析器来帮助确保您的代码正确无误。
有关详细信息,请参阅http://www.whentouseretaincount.com。